ZT 类模板的声明和实现是不能分离的
http://bbs.csdn.net/topics/380250382

- adlay
- adlay
- 等级:

引用 4 楼 的回复:
通过显示实例化你可以把模版的实现放在 cpp 里, 要不然的话模版实现必须放在 .h 里面.
好像不显示实例化, 我把模板放在main.cpp里面也没报错啊, 比如你把刚才我那句注释掉, 也可以运行的.
你是只有一个 cpp 的情况. 如果有多个 cpp 文件再使用这个模版, 你必须把它放在头文件里, 然后每个 cpp 都要 #include 这
个头文件. 显示实例化之后头文件里只需要声明, 然后在其中一个 cpp 里面实现并显示实例化, 其它的 cpp 就可以直接用了.
具体可以 google 一下 "模版声明实现分离"
今天本来打算用类模板来实现一些数据结构的
通用模块,以便以后能直接使用
可是测试的时候编译器一直
显示error LNK2001: unresolved external symbol
的信息。。
平时很少用模板类写东西,开始以为是语法错误,可是怎么都找不出语法问题
这时我百度查询下,才知道
原来类模板的声明和实现不能放在不同的文件中
即类模板的声明和实现是不能分离的
究
其原因,是因为类模板和函数模板都不是真正的定义,真正的定义是在模板实体化的时候由编译器完成的。如果将模板的定义部分和实现部分分离开来,编译器真正
要去完成模板实体化的时候就会因为找不到相应的代码而发生链接错误。即error LNK2001: unresolved external
symbol
另外,据说C++标准是要求能实现分离编译的。只不过实现起来难度太高,所以大部分主流编译器(当然也包括VC在内)都不支持这个功能。
虽然标准委员会出了一个叫EXPORT(你可以在MSDN里查到),但由于实现难度和会严重降低编译器的
优化作用,所以,至今没有编译器厂商实现了那个关键字。
所以,你还是习惯把它们写在一起吧。
毕竟STL也是这样写出来的
通常我们写通用代码时都习惯.h文件声明,.cpp文件实现功能,调用的时候包含.h文件
但是,以后大家用模板类实现自己的通用代码时,记得要把类声明和实现写到同一个.h文件或.cpp文件里
这样才不会出现链接错误!!
http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece7631046893b4c4380143fd3d1027fa3c215cc791f11506197ba27241713d5c77f6705b21902b7a52b33715066eccad58b4bd7b191282c8b2434721f854712d51ba9c14726c22a9a47fdea44a7ecff25e2a8c5a0de4323c844727e97f1fb4d711fdd1bfb0340e2b1ed4d025e60ad9c43728f5e6058eb3436b250f890251e029680d94b3dc13da711&p=93759a46d59813e94bbe9b7c7f51&newp=ce769a47ce9c11a05beed53f174492695803ed633dd3da0d20&user=baidu&fm=sc&query=%C4%A3%B0%E6%C9%F9%C3%F7%CA%B5%CF%D6%B7%D6%C0%EB&qid=&p1=4修改为:#include "src/stack.cpp"
也就是说直接包含这个cpp文件..等于就是把stack.h和stack.cpp全部包含进来.一起编译.
C++模板类不支持分离编译
模板类不支持分离编译。你需要把所有的申明和定义放在一个文件里实现。
举个例子,cpp_1.h如下:
template<class numtype>
class cpp_1 {
public:
numtype a;
cpp_1(numtype);
}
cpp.cpp如下:
#include "cpp_1.h"
template<class numtype>
cpp_1<class numtype>::cpp_1(numtype x){
a = x;
}
main.cpp如下:
#include "cpp.h"
int main(){
cpp_1<int> s(3); //第三行
return 0;
}
因为模板类不支持分离编译。上面第三行就会报错,编译器在编译cpp的时候不知道要生成cpp_1<int>::cpp_1(int)的代码,所以link的时候就找不到.
因此,正确的方法是,把模板类的声明和实现放在一个文件里。
本文地址http://www.chengxuyuans.com/download/qianduan/2013/0417/56700.html
ZT 类模板的声明和实现是不能分离的的更多相关文章
- ZT 类模板Stack的实现 by vector
*//*第3章 类模板 与函数相似,类也可以被一种或多种类型参数化.容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,你就可以实现容器类,而不需要确定容器中元素 ...
- 为什么 c++中函数模板和类模板的 声明与定义需要放到一起?
将模板的声明与定义写在一起实在很不优雅.尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义, 然后在main函数里包含.h头文件,这样会报链接错误.why!!!!!!!!!!!!! 这是因为 ...
- C++类模板的声明和定义为什么要放在同一个文件
不是只能放在.h里面,但是推荐放在.h里面.STL模板实现全部是放在.h里面的.------------------编译能通过.1)参与编译的只是.cpp文件,不会报错的原因,是因为它能在.h里面找到 ...
- [Reprint] C++函数模板与类模板实例解析
这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下 本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...
- C/C++:类模板
类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以取任意的数据类型,包括基本数据类型和自定义数据类型. 类模板的声明形式如下: template ...
- C++学习笔记(3)----类模板的static成员
与任何其他类相同,类模板可以声明 static 成员: template <typename T> class Foo { public: static std::size_t count ...
- error LNK2019 无法解析的外部符号------类模板和内敛函数
今天用类模型实现一个单链表,开始是.h和.cpp将类模板的声明与实现分开写的,结果总是报错: 错误 error LNK2019: 无法解析的外部符号 ?$SingleList@H@@QAE@XZ),该 ...
- C++学习之函数模板与类模板
泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思.泛型编程最初诞生于C++中,目的是为了实现C++ ...
- C++ 类模板详解(一):概念和基本使用方式
与函数模板类似地(C++函数模板详解(一):概念和特性) ,类也可以被一种或多种类型参数化.例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,我们就可以实 ...
随机推荐
- swiper在vue中的使用 及 神坑
一.实例化和导入 import Swiper from 'swiper'; let viewSwiper; let previewSwiper; 在外面声明全局变量,然后在初始化方法里面实例化swip ...
- textarea的placeholder属性内容折行显示(PC和移动端端)
1.PC端折行方法 placeholder="字体 字体" 可以使其折行显示 2.移动端折行方法 webkit内核 textarea::-webkit-input-placeh ...
- js / jquery 获取和设置 FCK Editor 的值
开发中遇到 通过 $("#content").val(); 或者 document.getElementById("content"); 并不能获取到 id 为 ...
- JAVA-4NIO之Channel之间的数据传输
转载:自并发编程网ifeve.com 在Java NIO中,如果两个通道中有一个是FileChannel,那你可以直接将数据从一个channel(译者注:channel中文常译作通道)传输到另外一个c ...
- ARP协议抓包之帧长度和Gratuitous ARP的问题
用Winpcap编程构造ARP包选择网卡并发出,遇到若干问题,学到了许多新知识,但是有的还尚未解决,在这里记录下没解决的和解决的问题. 先来看下ARP协议的格式,ARP字段有28个字节,发到以太网中还 ...
- Head First Python学习笔记2——文件与异常
文件处理 1.用open()就可以打开文件,但是请注意:文件里有中文请设置编码,如 :open("filepath","r",encoding="ut ...
- NSLog演化
使用下面代码打印行号,功能函数,以及要打印的内容 #if DEBUG #define MBLog(format, ...) NSLog((@"%s--[Line:%d]--" fo ...
- 【转】ArrayBlockingQueue浅析
ArrayBlockingQueue是常用的线程集合,在线程池中也常常被当做任务队列来使用.使用频率特别高.他是维护的是一个循环队列(基于数组实现),循环结构在数据结构中比较常见,但是在源码实现中还是 ...
- dubbo学习思路梳理
dubbo要解决的问题 rpc调用需要定制.额外的工作量 分布式服务中,服务动辄几十上百,相互之间的调用错综复杂,相互依赖严重 对集群性的服务,需要负载策略 对集群性的服务,能动态扩展节点 dubbo ...
- PCA vs Linear Regression 可视化理解
https://shankarmsy.github.io/posts/pca-vs-lr.html https://shapeofdata.wordpress.com/2013/04/09/princ ...