今天编程时碰到一个问题,写了一个单例的类模板,之前程序一直能跑,但今天使用了其中一个函数时却报错。后续查错,发现是自己忘记写结束符号了。
这就引出我知识点的不足了——之前为啥能跑正常?错误一只存在,为啥总是能编译通过?类中的函数何时才被实例化?类何时实例化?实例化的类是不是所有的函数都同时被实例化?
整理和理解网上资料后获得如下总结:
1.在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化。
1.1声明一个类模板的指针和引用,不会引起类模板的实例化,因为没有必要知道该类的定义。
1.2定义一个类类型的对象时需要该类的定义,因此类模板会被实例化。
1.3在使用sizeof()时,它是计算对象的大小,编译器必须根据类型将其实例化出来,所以类模板被实例化.
1.4new表达式要求类模板被实例化。
1.5引用类模板的成员会导致类模板被编译器实例化。
1.6需要注意的是,类模板的成员函数本身也是一个模板。标准C++要求这样的成员函数只有在被调用或者取地址的时候,才被实例化。用来实例化成员函数的类型,就是其成员函数要调用的那个类对象的类型
总结1很好的解释了为啥我的程序在调用特定的成员函数时才会报错。
不过上面的介绍还是比较笼统,还有很多的细节点需要注意到,从网上转载如下:转载链接:http://www.cnblogs.com/assemble8086/archive/2011/10/02/2198308.html
一、类模板定义及实例化
1. 定义一个类模板:
1 template<class 模板参数表>
2
3 class 类名{
4
5 // 类定义......
6
7 };
其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数 ,也可以是非类型参数。类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。
例:
1 template<class type,int width>
2
3 //type为类型参数,width为非类型参数
4
5 class Graphics;
注意:
(1)如果在全局域中声明了与模板参数同名的变量,则该变量被隐藏掉。
(2)模板参数名不能被当作类模板定义中类成员的名字。
(3)同一个模板参数名在模板参数表中只能出现一次。
(4)在不同的类模板或声明中,模板参数名可以被重复使用。
1 typedef string type;
2
3 template<class type,int width>
4
5 class Graphics
6
7 {
8
9 type node;//node不是string类型
10
11 typedef double type;//错误:成员名不能与模板参数type同名
12
13 };
14
15 template<class type,class type>//错误:重复使用名为type的参数
16
17 class Rect;
18
19 template<class type> //参数名”type”在不同模板间可以重复使用
20
21 class Round;
(5)在类模板的前向声明和定义中,模板参数的名字可以不同。
1 // 所有三个 Image 声明都引用同一个类模板的声明
2
3 template <class T> class Image;
4
5 template <class U> class Image;
6
7 // 模板的真正定义
8
9 template <class Type>
10
11 class Image { //模板定义中只能引用名字”Type”,不能引用名字”T”和”U” };
(6)类模板参数可以有缺省实参,给参数提供缺省实参的顺序是先右后左。
1 template <class type, int size = 1024>
2
3 class Image;
4
5 template <class type=double, int size >
6
7 class Image;
(7)类模板名可以被用作一个类型指示符。当一个类模板名被用作另一个模板定义中的类型指示符时,必须指定完整的实参表
1 template<class type>
2
3 class Graphics
4
5 {
6
7 Graphics *next;//在类模板自己的定义中不需指定完整模板参数表
8
9 };
10
11 template <calss type>
12
13 void show(Graphics<type> &g)
14
15 {
16
17 Graphics<type> *pg=&g;//必须指定完整的模板参数表
18
19 }
2.类模板实例化
定义:从通用的类模板定义中生成类的过程称为模板实例化。
例:Graphics<int> gi;