您的位置:首页 > 编程语言 > C语言/C++

c++模板类在继承中子类无法访问父类的成员

2018-03-23 17:58 267 查看

c++模板类在继承中子类无法访问父类的成员

问题:c++模板类在继承中子类无法访问父类的成员

解决方法:在子类访问父类时加上父类的前缀或使用this->调用

c++从入门到放弃,感觉c++了解的越多,就越不会(心累啊)

最近在写一套数据结构的模板库,遇到了很多问题,比如头文件的重复引入,定义等等,这次说说新遇到的问题,模板类的继承中子类无法访问父类的成员,

子类不能访问父类的成员在VC++中可以编译通过,而用g++就会报错


先列出我查过的资源,要转载的话注意作者的版权

1. https://www.zhihu.com/question/28139230

2. https://bbs.csdn.net/topics/391862079

3. https://blog.csdn.net/u012175089/article/details/54231791

template <class T>
class Base{
public:
T data;
void display();
};
template <class T>
class Derive:public Base<T>{
void show(){cout << data;}
};
//上面的代码无法编译通过,子类无法访问基类的成员变量或成员函数,
//用this访问即可,也可以直接在成员前家基类的名字Base<T>::


1.对于两个非模板继承是可直接继承.

2.对于模板类继承非模板类时,在模板声明进行解析的时候就会进行查找

3.对于继承父类是模板类的会进行名称二次查找

模板定义阶段:刚被定义时,只有模板中独立的名字(可以理解为和模板参数无关的名字)参加查找
模板实例化阶段:实例化模板代码时,非独立的名字才参加查找。
//一个模板子类其实是不能在实例化之前就知道他的模板父类到底是谁,所以只能this->了


c++ 两阶段名字查找,对于非依赖模板名称的都是现场决议的,编译器不查找基类 scope,没找到就报错,编译器不查找基类,因为此时基类还是个类模板,到底是什么东西还不定呢。

然后实例化的时候进行第二阶段名字查找,这时候所有类型都是确定的,才能够查找基类 scope。

增加 this 或 Base:: 就是把对 function 的查找延迟到第二阶段,这是 c++ 标准规定的。

这里有一个带栗子的博客,可以看看比较详细:二次查找的栗子

c++继承中名字的查找
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: