模板类继承后找不到父类函数的问题
错误示例:
1 template<class T> class List 2 { 3 public: 4 void next(T*){ 5 cout<<"Doing some stuff"<<endl; 6 } 7 }; 8 9 template<class T> class Special_List: public List<T> 10 { 11 public: 12 void do_other_stuff(T* item){ 13 next(item); 14 } 15 }; 16 17 18 int main(int argc, char *argv[]) 19 { 20 Special_List<int> b; 21 int test_int = 3; 22 b.do_other_stuff(&test_int); 23 }
使用g++编译,出现如下错误:
1 template_eg.cpp: In instantiation of 'void Special_List<T>::do_other_stuff(T*) [with T = int]': 2 template_eg.cpp:27:35: required from here 3 template_eg.cpp:18:25: error: 'next' was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive] 4 template_eg.cpp:18:25: note: declarations in dependent base 'List<int>' are not found by unqualified lookup 5 template_eg.cpp:18:25: note: use 'this->next' instead
解决方法:
1、
this->next(item)
2、
List<T>::next(item)
3、
1 template<class T> class Special_List: public List<T> 2 { 3 using List<T>::next; 4 public: 5 void do_other_stuff(T* item){ 6 next(item); 7 } 8 };
具体原因:
模板的处理过程分为两步(标准编译,VS是另一种方式)。第一步,在类型实例化前,所有不依赖于模板参数的数据被查找和检查。第二部,类型确定,而后处理剩余的部分。
现在,在第一阶段,没有迹象表明next函数是依赖于模板参数的,因此它需要再类型例化前被处理。但是基类型是被当前模板例化的,且并不知道类型T会被例化成怎样的类,编译器无法进入基类中查找。
而this->next则将next加入了依赖模板的函数名单,这使得编译器会在第二阶段才查找next函数的实现,这时T是已知类型,基类List<T>也是已知的,编译器可以进入查找。
在处理的第二阶段,查找表只会查找参数依赖表中的函数并添加进表中。如果next函数是一个与T有关的namespace中,那么它会被查找添加,而如果它仅是基类的一个成员函数,那么它对于ADL是不可见的。对于next函数,编译器需要在查找表中检索next,而对于this->next,编译器查找的是this(在第二阶段模板类型例化后),之后才会查找next。
ADL(参数依赖查找,Argument-dependent lookup):http://www.cnblogs.com/zl1991/p/7718718.html
模板类继承后找不到父类函数的问题相关推荐
- 【c++】模板类继承模板类
C++继承访问权限:https://www.runoob.com/cplusplus/cpp-inheritance.html 1. 普通类继承 demo #include <iostream& ...
- python类继承可以有多个父类_Python3基础 多重继承 一个子类继承于多个父类
镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体. ------------------------------------- ...
- C++ 笔记(31)— 类继承
1. 私有和保护 成员函数或成员数据可以是公有或者私有的.如果是公有的,那么它们可以被直接访问:如果是私有的,那么它们无法被直接访问.同时,还有一个 protected 保留字,在没有使用继承的时候, ...
- 用汇编的眼光看C++(之模板类)
[ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 如果类是一种确定的数据类型,那么模板就是一种对类的抽象.假设有这么一种类,它需要进行数据的计算 ...
- 【C++】模板类的友元函数
模板类友元函数 模板类的友元函数 参考:https://blog.csdn.net/dreamer_lhs/article/details/53580088 区分:友元是否为函数模板 非模板友元 约束 ...
- 模板类可以使用虚函数,模板函数不能是虚函数
1.普通的类中怎么使用虚函数,模板类中也可以这么使用虚函数 不过需要注意的是使用模板类定义不同的类型则是两个完全不同的类. 2.模板函数不能是虚函数 编译器期望在处理类定义的时候就能确定虚函数表的大小 ...
- 父类为模板类,子类继承父类调用父类的方法常见错误
相信大家都对继承很清楚,那么如果是父类为模板类,派生出来的子类创建的对象,具体实现要如何调用父类的方法呢? 我们用代码尝试一下 #include<iostream> #include< ...
- 【C++模板编程入门】模板介绍、模板定义、函数模板、类模板、模板的继承
1.模块的引入 1.1.示例代码 #include <iostream> #include <string>using namespace std;//用template声明T ...
- [C++]模板类的继承
1. 模块基类不用指定传参类型 // 定义模板类,作为父类 template <typename T> class People { public:T x;People(){};Peop ...
- C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员
一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...
最新文章
- 李飞飞、颜宁等8位华人学者入选美国艺术与科学院院士,其中7位女性
- Silverlight/Windows8/WPF/WP7/HTML5周学习导读(9月24日-9月30日)
- wordpress插入腾讯视频的方法
- Redis Bloom布隆过滤器的安装及使用
- 添加库文件_PLC|教你把 Micro/WIN 的库文件导入到 Micro/WIN SMART 中
- mysql多表in查询_MySQL多表查询
- 【通信协议】I2S/IIS总线介绍
- Robocup 仿真2D 学习笔记(一) ubuntu16.04 搭建 robocup 仿真2D环境
- ClouderaManager介绍、CDH特点、ClouderaManager架构、ClouderaManager功能、Cloudera Management Service
- jquery手写轮播图_用jquery实现图片轮播怎么写呢求指教
- 阿里巴巴与蚂蚁集团开源框架SOFA Boot
- 转:为什么谷歌越来越牛逼,而百度却...
- python loop call soon_python中call方法怎么使用?
- Android 9.0 Pie(派),9.0适配
- python利用正则爬取内涵段子内容
- BPL 和动态加载包
- NDI Bridge使用说明——与本地网络之外的其他人共享 NDI 源
- 意淫系列-2018美图春招笔试题
- 高数不定积分72题解答
- 华为云讲解:1. Istio架构与原理
热门文章
- vios接口虚拟服务器,虚拟VIOS服务器安装手册V1.0.doc
- arm el2与el3_ARM下的EL/PL概念
- PyG教程(4):自定义数据集
- 迷你星球java,如何用手机制作迷你星球?迷你星球制作方法演示
- 中国车牌号的识别大全
- Release That Record Lock!
- java.lang.reflect.UndeclaredThrowableException
- 新项目六之集成新版友盟统计
- spring-cloud-starter-bus-kafka利用kafka消息总线实现动态刷新配置
- 《Linux内核设计与实现》读书笔记(八)- 中断下半部的处理