template类模版实例化易出现的问题

在Xcode中使用C++模板类时,可能会遇到子类无法找到基类成员的问题。这是因为模板类只有在实例化后其成员函数类型才确定。编译器首先在局部和全局符号表中查找成员变量,而未实例化的基类不在其中,导致错误。解决方案是在引用基类成员变量前使用`this->`关键字,提示编译器实例化基类并找到成员定义。
摘要由CSDN通过智能技术生成

在用Xcode写C++时,当使用了类模版,可能会出现发现子类找不到基类的成员,如图
子类找不到基类成员
此处的Search_tree继承自Binary_tree
这里写图片描述
root指针为基类Binary_tree的成员变量
这里写图片描述
其实这是C++语言一个弊端所在,也是类模版的实例化存在的问题。


对于普通的类我们都知道,包含了头文件之后就会进行实例化,类中函数的类型就已经确定了,main函数里包含类的声明,编译之后的 main.o 文件可以拿到普通类的函数地址进行调用,也就是编译时会生成相关二进制代码,如:

class A {
public:

private:
int a;
};//此处即已实例化
int main()
{

}


但是对于类模版的话,只有在实例化之后,成员函数的类型才是确定的, 才有确定的类函数地址可供 main()函数调用。只有在使用这个类的时候,才会进行编译。如:

template
class A {
public:

private:
T data;
//此处编译器只是做了一个记号,表示模版类存在
};
int main()
{
A x;

当子类直接使用基类的protected变量的时候(没有this->),编译器会进行如下操作:
- 首先在当前函数的符号里寻找(局部变量)
- 找不到会去全局变量里寻找(全局变量)
然后还是找不到,因为基类此时还没有被实例化,所以它并不会在基类的符号表里寻找这个成员变量的定义,也就是为什么会报Use of undeclared identifier 'root'未定义这样的错误了。


解决办法就是在引用基类的成员变量前加上this->,如图这里写图片描述
再build一下,成功了。

原因大致是当你加上this->后,等于直接告诉了编译器这个变量就是类成员变量,那么编译器就会先实例化它的基类,然后就可以找到变量的定义了,编译成功~

不过JAVA的编译机制并不相同,待续~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值