问题来源
在学习邓俊辉老师的数据结构课程时,对照着书编码。在编写Stack类时继承了Vector,但是编译时总是提示没有size()函数定义即: there are no arguments to 'size' that depend on a template parameter, so a declaration of 'size' must be available 。size()属于Vector<T>,但是Stack是共有继承于Vector,应当已经有了size()的定义。 经过网上查找。可以添加"this->"来解决,这就很奇怪了,类中不是默认的吗。
问题探究
后来查资料发现模板类的继承后父类函数的使用是有要求的,如果不加this或者不使用接下来的另外两种方式,那么会认为size()函数是 非成员函数 。在Effective C++(第三版)条款43 中给出了模板类继承时使用父类成员函数方法:
- 在父类函数调用动作之前加"this->";
//size();//更换成如下
this->size();
- 使用using声明;
using Vector<T>::size;//在使用size()之前明确声明size()函数的归属,
auto size_a=size();
- 明白指出被调用函数位于父类中;
Vector<T>::size(Rank r,T const &e);//指出父类包含此成员函数
auto size_a=size();
但是第3中方法在有size()函数的多态时不好,会关闭其多态行为。
最后还需要注意的是模板类的实现也最好放在.h文件中,如果放在.cpp文件中,在使用时需要包含.cpp文件,即:
#include"Vector_rl.cpp"//模板实现的cpp文件