2013-01-14 101 views
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) {} 
}; 

这将编译于2010年MSVC罚款,但没有相克++ 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) 

发生了什么事?

+0

http://www.parashift.com/c++-faq/nondependent-name-lookup-members.html – aschepler

回答

1

你要做的:

this->base_method(); 

Base<dimension>::base_method(); 

编译器一般不会考虑在模板基类功能的解决方法。

+1

(请注意,第一个允许虚拟覆盖,第二个不允许) – aschepler

+0

“编译器通常不会考虑方法在模板化的基类中进行功能解析。“有趣。谢谢, – imallett

1

您必须明确地呼叫Base<dimensions>::base_method()