there are no arguments to 'size' that depend on a template parameter, so a declaration of 'size' ...

问题来源

在学习邓俊辉老师的数据结构课程时,对照着书编码。在编写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->"来解决,这就很奇怪了,类中不是默认的吗。

图1:错误地方

图2:修改后编译通过

问题探究

后来查资料发现模板类的继承后父类函数的使用是有要求的,如果不加this或者不使用接下来的另外两种方式,那么会认为size()函数是 非成员函数 。在Effective C++(第三版)条款43 中给出了模板类继承时使用父类成员函数方法:

  1. 在父类函数调用动作之前加"this->";
//size();//更换成如下
this->size();
  1. 使用using声明;
using Vector<T>::size;//在使用size()之前明确声明size()函数的归属,
auto size_a=size();
  1. 明白指出被调用函数位于父类中;
Vector<T>::size(Rank r,T const &e);//指出父类包含此成员函数
auto size_a=size();

但是第3中方法在有size()函数的多态时不好,会关闭其多态行为。
最后还需要注意的是模板类的实现也最好放在.h文件中,如果放在.cpp文件中,在使用时需要包含.cpp文件,即:

#include"Vector_rl.cpp"//模板实现的cpp文件
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 最近看到自己之前刚开始学习的时候记的一些笔记就稍微整理了一下 c语言里的结构体和c++里的结构体有什么区别? 答:...
    你猜卟透_faa8阅读 4,560评论 0 0
  • 参考链接: https://light-city.club/sc/ https://chenxiaowei.git...
    雪上霜阅读 3,359评论 0 0
  • C++对C的加强 0.面向过程–>函数+面向对象–>类和对象 1.namespace命名空间 2.实用性 增加 -...
    钱嘘嘘阅读 3,674评论 0 2
  • 初学《C++编程思想》,感觉很不对胃口,可能是习惯了《C++ primer》,同样是讲解相同的某个知识点,但我感觉...
    程序爱好者阅读 4,773评论 1 1
  • 1.C和C++的区别?C++的特性?面向对象编程的好处? 答:c++在c的基础上增添类,C是一个结构化语言,它的重...
    杰伦哎呦哎呦阅读 13,273评论 0 45