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++函数模板详解(一):概念和特性) ,类也可以被一种或多种类型参数化.例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,我们就可以实 ...
随机推荐
- SpringMVC源码阅读:Json,Xml自动转换
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- 既之前的基础,先写个简单的PHP 与数据库 的数据交流
程序分三个板块, 现在先不用 css 和 javascript 先用纯 html php 写吧. 所以那些 嵌入式 <font size=.... 什么的看看就算了,不推荐如此使 ...
- 百度前端技术学院-task1.8源代码
主要是不采用bootstrap实现网格. 遇到的困难及注意点如下: 1.[class*='col-'],这个是选择col-开头的类,第一次用,以前也只是看到过: 2.媒体查询,总觉得容易理解错误.@m ...
- Socket编程 - API
基础知识部分:http://www.cnblogs.com/Jimmy1988/p/7839940.html 1. 基本流程 Process Client Server Comment socket( ...
- Dev中控件的js事件代码放在form标签中存在问题
Dev中控件的js事件代码放在form标签中会获取不到(head标签中有其他js代码,未验证是否是这个问题)
- Jquery 筛选选择器
筛选选择器(方法) 既然是方法 那就应该对象调用 obj.metch(); $(“.dd”).children("ul"),show(); //找到.dd下 ...
- 第二节:Java开发环境的搭建
一.认识并安装JDK 1.JDK(Java Development Kit)是Java开发工具集,包括Java运行环境(JRE).Java开发工具以及一些基础类库,进行Java开发所必须安装的软件. ...
- Code Signal_练习题_matrixElementsSum
After they became famous, the CodeBots all decided to move to a new building and live together. The ...
- Airbnb JavaScript Style Guide
Airbnb JavaScript Style Guide() { 用更合理的方式写 JavaScript ES5 的编码规范请查看版本一,版本二. 翻译自 Airbnb JavaScrip ...
- 微信小程序为什么不被看好?
我自认为对新技术还是比较有热情的,可对于小程序这个“新技术”,我却完全是被动的.去年9月份的时候,微信小程序开始内测,瞬间引爆朋友圈.知乎等一众分享平台.当时我大概了解了一下,觉得从技术角度上来说没啥 ...