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

来源:互联网 发布:洗数据 编辑:程序博客网 时间:2024/06/13 23:44

在用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的编译机制并不相同,待续~~

阅读全文
0 0
原创粉丝点击