1

我遇到了一个问题,我最终将其简化为这个简单的示例:

template <int dimensions> class Base {
    protected:
        Base(void) {}
    public:
        virtual ~Base(void) {}

        void base_method(void) {}
};
template <int dimensions> class MyClass : public Base<dimensions> {
    public:
        MyClass(void) : Base<dimensions>() {
            base_method();
        }
        ~MyClass(void) {}
};

这在 MSVC 2010 上编译得很好,但在 g++ 4.6 上失败:

main2.cpp: In constructor âMyClass<dimensions>::MyClass()â:
main2.cpp:12:16: error: there are no arguments to âbase_methodâ that depend on a template parameter, so a declaration of âbase_methodâ must be available [-fpermissive]
main2.cpp:12:16: note: (if you use â-fpermissiveâ, G++ will accept your code, but allowing the use of an undeclared name is deprecated)

这是怎么回事?

4

2 回答 2

1

您必须显式调用Base<dimensions>::base_method().

于 2013-01-14T15:59:36.933 回答
1

你所要做的:

this->base_method();

或者

Base<dimension>::base_method();

编译器通常不会考虑模板化基类中的方法来进行函数解析。

于 2013-01-14T16:00:39.763 回答