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++模板类编程的链接问题
- C++模板的问题集锦
- linux c问题集锦
- C语言问题集锦
- C++/C 程序员要掌握的问题集锦之一
- C++/C 程序员要掌握的问题集锦之二
- C++/C 程序员要掌握的问题集锦之三
- C++/C 程序员要掌握的问题集锦之一
- C++/C 程序员要掌握的问题集锦之二
- C问题集锦(一)
- C语言面试问题集锦
- c字符-字符串问题集锦
- C语言_问题集锦
- C语言小问题集锦
- 面试中常见的C/C++问题集锦
- Linux下C代码开发中遇到的问题集锦
- 域名解析的问题集锦
- [问题]AS的问题集锦
- C语言问题集锦1-10
- TensorFlow学习笔记(九):CIFAR-10训练例子报错解决
- windows kafka安装及问题解决
- Ubuntu忘记root密码怎么破??
- 控件OnPaint,导致主窗口的对话框弹出时无法显示
- 更改mysql 远程密码,
- C++模板的问题集锦
- 系统权限
- oracle 使用 START WITH…CONNECT BY PRIOR 实现递归查询
- @Autowired与@Resource的区别
- android开发中Edittext控件横屏遮住屏幕问题!
- 神经网络中weight decay起到的做用是什么?momentum呢?normalization呢?
- android Vsync workflow
- 【AngularJS】scope根作用域;
- 命名体识别