http://bbs.csdn.net/topics/380250382

adlay
adlay
等级:
#9 得分:0 回复于: 2012-03-31 11:19:35
引用 6 楼  的回复:

引用 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
 
一堆的undefined reference to...
通过查询各种搜索引擎,得知,究其原因还是在于,模板类的实现分离过于复杂..导致许多编译器无法实现这个功能.
而综合各种解决方案最简单的还是两种:
(1)不分离...声明实现全部放在.h中
(2)分离,但是要修改main.cpp中的include.
原来是#include "include/stack.h"

修改为:#include "src/stack.cpp"

也就是说直接包含这个cpp文件..等于就是把stack.h和stack.cpp全部包含进来.一起编译.

C++模板不支持分离编译

时间:2013-04-17 12:34来源:www.chengxuyuans.com
 

模板不支持分离编译。你需要把所有的申明和定义放在一个文件里实现

举个例子,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 类模板的声明和实现是不能分离的的更多相关文章

  1. ZT 类模板Stack的实现 by vector

    *//*第3章 类模板 与函数相似,类也可以被一种或多种类型参数化.容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,你就可以实现容器类,而不需要确定容器中元素 ...

  2. 为什么 c++中函数模板和类模板的 声明与定义需要放到一起?

    将模板的声明与定义写在一起实在很不优雅.尝试用“传统”方法,及在.h文件里声明,在.cpp文件里定义, 然后在main函数里包含.h头文件,这样会报链接错误.why!!!!!!!!!!!!! 这是因为 ...

  3. C++类模板的声明和定义为什么要放在同一个文件

    不是只能放在.h里面,但是推荐放在.h里面.STL模板实现全部是放在.h里面的.------------------编译能通过.1)参与编译的只是.cpp文件,不会报错的原因,是因为它能在.h里面找到 ...

  4. [Reprint] C++函数模板与类模板实例解析

    这篇文章主要介绍了C++函数模板与类模板,需要的朋友可以参考下   本文针对C++函数模板与类模板进行了较为详尽的实例解析,有助于帮助读者加深对C++函数模板与类模板的理解.具体内容如下: 泛型编程( ...

  5. C/C++:类模板

    类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以取任意的数据类型,包括基本数据类型和自定义数据类型. 类模板的声明形式如下: template ...

  6. C++学习笔记(3)----类模板的static成员

    与任何其他类相同,类模板可以声明 static 成员: template <typename T> class Foo { public: static std::size_t count ...

  7. error LNK2019 无法解析的外部符号------类模板和内敛函数

    今天用类模型实现一个单链表,开始是.h和.cpp将类模板的声明与实现分开写的,结果总是报错: 错误 error LNK2019: 无法解析的外部符号 ?$SingleList@H@@QAE@XZ),该 ...

  8. C++学习之函数模板与类模板

    泛型编程(Generic Programming)是一种编程范式,通过将类型参数化来实现在同一份代码上操作多种数据类型,泛型是一般化并可重复使用的意思.泛型编程最初诞生于C++中,目的是为了实现C++ ...

  9. C++ 类模板详解(一):概念和基本使用方式

    与函数模板类似地(C++函数模板详解(一):概念和特性) ,类也可以被一种或多种类型参数化.例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,我们就可以实 ...

随机推荐

  1. centos 6.5安装docker

    安装linux,需要系统内核为3.x以上,如果centos版本为7以下,先升级系统内核 1.关闭selinux setenforce 0 sed -i '/^SELINUX=/c\SELINUX=di ...

  2. [转]WebForm中使用MVC

    本文转自:https://www.cnblogs.com/encoding/articles/3556046.html 前言 掐指一算,3年没写博了,好懒的说... 众所周知,MVC现在越来越火了,不 ...

  3. 快速安装.net 4.0

    1.打开运行输入 cmd 2.输入 cd C:\Windows\Microsoft.NET\Framework\v4.0.30319 3.输入 aspnet_regiis.exe -i

  4. PHP错误日志和内存查看

    1.通过命令查看服务器上一共开了多少的 php-cgi 进程: ps -fe |grep "php-fpm"|grep "pool"|wc -l 2.查看FPM ...

  5. Hive,HANA可视化客户端工具

    目前市面上的Hive可视化客户端工具,大都是C/S模式的,安装使用都不是太方便,目前有一款基于WEB的可视化工具TreeSoft,通过浏览器就可以访问使用了,并且可以同时管理.维护.监控MySQL,O ...

  6. html中内联元素和块元素的区别、用法以及联系

    昨天用asp.net的BulletedList做一个导航栏,最终该控件形成的html代码是ul列表和a超链接,具体代码如下: <ul id="BulletedList1" s ...

  7. ANT DESIGN PRO 脚手架.... 懒人福音

    早上在用蚂蚁组件,看到一个红红的 PRO , 什么鬼,点了看. https://pro.ant.design/index-cn 一脸懵逼, 中台前端??? 预览再看: 后台管理的demo , 脚手架  ...

  8. asp.net mvc +easyui 实现权限管理(一)

    权限是每个企业应用必须的模块,可以简单,也能比较复杂.目前我们公司的权限要求是 能管控页面.字段.按钮.以及数据权限. 正好公司的进销存系统权限模块由我负责.做完后做下记录是个不错的习惯,知识是慢慢积 ...

  9. chrome 浏览器调用 ocx 插件

    原文:http://blog.csdn.net/wangchao1988ok/article/details/45193489 IE 上使用 ocx 插件网上已经有很多资料说明,这里就不重复了,那如何 ...

  10. canvas验证码 - 随机字母数字

    基于canvas制作随机生成数字英文组合验证码效果,点击或刷新会自动重组.输入验证码提交验证效果代码. <div class="verification"> <i ...