分类: C/C++
2013-01-15 22:31:43
Item 43: Know how to access names in templatized base
看下面的程序:
template编译是会报错的:class base { public: T var; void print(){cout<<"in T Base \n";} }; template class de: public base { void dp(){print();} };
test.cpp: In member function 'void de
test.cpp:63:18: error: there are no arguments to 'print' that depend on a template parameter, so a declaration of 'print' must be available [-fpermissive]
test.cpp:63:18: note: (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
派生类dp函数中调用基类的print,看着毫无问题,可在编译时编译器并不知道base是什么东东(或者是否有针对其的特化),print是否为其成员,所以找不到print这个名字。
通过下面的方法可以通过编译
方法一:使用this指针
void dp(){this->print();}
方法二:使用using语句
template方法三:直接域作用符调用class de: public base { using base ::print; void dp(){print();} };
templateclass de: public base { void dp(){base ::print();} }; 涉及到虚函数时,推荐使用第一种。