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的编译机制并不相同,待续~~
- template类模版实例化易出现的问题
- c++ Template模版类,实例
- Template模版实例(C++)
- C++学习笔记36 模版的显式具体化(template specialization)和显式实例化(template instantiation)
- template类模版的用法举例
- C++ template--类模版Stack的实现
- c++ 函数模版,类模版,实例化,具体化,模版作参数,模版的友元
- 类模版的实例化instantiation
- 关于模版类编译出现unresolved external symbol的问题
- 对于模版中实例化的的顺序问题
- C++ Template中关于模板类的成员模板函数显示实例化的问题
- [c++ primer plus]c++ 函数模版,类模版,实例化,具体化,模版作参数,模版的友元
- [c++ primer plus]c++ 函数模版,类模版,实例化,具体化,模版作参数,模版的友元
- jquery的template模版功能
- 函数模版与类模版template
- 模版template
- template模板及模板类的实例化
- 对c++模版的认识 template关键字
- 基于单链表以及环形队列的生产者消费者模型
- MyEclipse中出现Multiple annotations found at this line:
- volatile 和 synchronized 关键字区别
- 二分查找(面试必备)
- YII2框架学习 高效篇(二) 数据缓存
- template类模版实例化易出现的问题
- Problem A
- HTML5 inline-block和float的共性和区别
- Nginx反向代理和负载均衡部署指南
- 用git命令克隆github项目
- mysql使用binlog恢复使用delete误删的数据
- WIN7右键在目录当前打开命令行Cmd窗口
- R语言将层次聚类中的树分成簇
- 几点感想-20170611