今天编程时碰到一个问题,写了一个单例的类模板,之前程序一直能跑,但今天使用了其中一个函数时却报错。后续查错,发现是自己忘记写结束符号了。

这就引出我知识点的不足了——之前为啥能跑正常?错误一只存在,为啥总是能编译通过?类中的函数何时才被实例化?类何时实例化?实例化的类是不是所有的函数都同时被实例化?

 

整理和理解网上资料后获得如下总结:

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

一、类模板定义及实例化

. 定义一个类模板:

C++ 模板何时被实例化
1 template<class 模板参数表>
2
3 class 类名{
4
5 // 类定义......
6
7 };
C++ 模板何时被实例化

 

其中,template 是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数 ,也可以是非类型参数。类型参数由关键字class或typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义中的一个常量。

例:

1 template<class type,int width>
2
3 //type为类型参数,width为非类型参数
4
5 class Graphics;

相关文章: