C++模板的问题集锦

来源:互联网 发布:智巢网络 编辑:程序博客网 时间:2024/05/26 05:53

关于C++模板的链接错误问题

前几天写了一个模版,按以前的习惯,把定义写在头文件中, 把实现写在cpp文件中。结果在编译的时候没有发生错误,但在连接的时候出现了找不到xxx的错误。一时之间不知道该怎么办才好,后来上网一查,自己再一想,唉,原来如此:
模版之所以为模版,就是可以容纳不同的类型嘛,所以它只有在指定了其类型的时候才会生成实际的代码,如果你只把模版的定义写在头文件中,那么你生成在使用模版的时候就只会有声明的定义部分,而没有其具体的实现,所以链接器在连接时会报错。
解决的办法有两个:
1. 把模版的声明和实现都写在一个头文件中,然后用的时候包含这个头文件。
2. 如果你已经把它们分开了,比如说xxx.h xxx.cpp。那也好办,只好在使用的时候#include “xxx.h” #include “xxx.cpp”即可。


限制模板只能某些已知类型进行实例化

可能有时候我们需要限定我们所编写的模板的应用范围,我们可以通过下面的方式实现.在实现之前我们应该简单的说明一下,C++编译器对模板的处理过程:
编译器遇到模板定义时会进行语法检查,但不进行编译,当编译器遇到遇到一个实例化的模板时,才会编译出对应实例化类型的实例化代码,进而生成目标文件,供我们链接程序时使用,这似乎说明如果我们只是定义了模板,而没有使用,那么到最后我们的目标文件中是找不到模板的踪影的,我们也就是抓住模板的这个特性,在实现模板方法的源文件中添加模板的对应类型的显示实例化,那么最后这个源文件也将只包含我们实例化后对应模板类的定义,如果某个类型我们没有在这个源文件中对其进行显示实例化,我们这个源文件生成的目标文件中将不会包含这个未实例化模板的类的定义,如果我们在其他文件中尝试模板去实例化新的类型,将会出现连接错误。
根据以上说明,我们的实现步骤大致如下:
1.模板的声明放到一个头文件中
2.模板的实现放到另外一个源文件中
3.在实现模板的源文件中显示的特化本末班支持的类型

C++模板类编程的链接问题

原创粉丝点击