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++函数模板详解(一):概念和特性) ,类也可以被一种或多种类型参数化.例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,我们就可以实 ...
随机推荐
- composer如何自动验证并获取gitlab的私有库?
近期购买了Laravel的nova以后,需要对它的核心代码做一些修改,为方便与团队其他成员分享,以及在nova官方库更新后方便对差异管理.便将nova库挂在自己的gitlab,通过compos ...
- bootstrap 报错
1. bootstrap table 加载出错,前台报错 Cannot read property 'colspan' of undefined { title : '设备类型', field : ' ...
- java.sql.SQLException: Access denied for user 'root '@'localhost' (using password: YES) 最蠢
我犯了七年前的错误,一个空格,昨天就想到的,还对比了一下密码有没有空格 问题原因1:多写空格 在datasource.properties 中的username 的值root后面多写了一个空格, jd ...
- office中把标题之后的空格去掉
调整列表缩进--编号之后不特别标注可以把标题之后的空格去掉
- jquery插件导出word:jquery.wordexport.js
前言 今天项目中遇到一个需求把我们系统中的统计数据导出来(主要是表格).其实实现的的方法有很多,而此次针对我的系统第一获取数据有点慢,加上前不久写了一个在线阅读pdf,故此这次也想用前端的方式来导出. ...
- CSS阴影盒子
box-shadow:inset 横向偏移量 纵向偏移量 模糊范围 扩展范围 阴影颜色: 1.inset :(可选) 内阴影,不设置inset,表示盒子外部显示一个投影.也可写在最后. 2.横 ...
- C#中深拷贝和浅拷贝
一:概念 内存:用来存储程序信息的介质. 指针:指向一块内存区域,通过它可以访问该内存区域中储存的程序信息.(C#也是有指针的) 值类型:struct(整形.浮点型.decimal的内部实现都是str ...
- C#设计模式--代理模式(学习Learning hard 设计模式笔记)
class Program { static void Main(string[] args) { //创建一个代理对象 并发出请求 Person proxy = new Friend(); prox ...
- 给model模型传数组参数
$res = $this->Company->companyDischarge($this->user_id,array(0=>'c.limit_sum>0',1=> ...
- mysql索引类型normal,unique,full text的区别
normal:表示普通索引 unique:表示唯一的,不允许重复的索引,如果该字段信息保证不会重复例如身份证号用作索引时,可设置为unique full textl: 表示 全文搜索的索引. FULL ...