文档章节

C++模板类注意事项

secondtonone1
 secondtonone1
发布于 2016/08/09 18:01
字数 515
阅读 10
收藏 0

最近使用C++模板,虽然工作几年了,但是模板用的很少,确切的说自己实现的机会很小。

昨天写了一个代码maxheap.h 中实现了类模板的声明,我将实现写在maxheap.cpp中,

当在main.cpp中引用maxheap中的接口时,提示链接错误。网上提供了几个解决方案,

第一种方式是将maxheap.h和maxheap.cpp包含在某个.h文件中,这样在main函数中

包含这个.h即可。第二种方式叫分离模式,我没看,觉得没必要搞得那么复杂。第三种方式

是我最看好的方式,就是将模板类的实现也放在.h中。C++ stl模板就是在.h中实现的。

 

C++编译文件将.cpp编译为.o文件,在链接阶段将.o文件链接生成可执行文件。问题

就出现在模板实现的.cpp文件并不在编译时实例化,读者可以试着在模板实现的.cpp里

写一些错误的代码,编译器并没有监测到,因为模板实现的cpp没有参与编译。他需要在特定类型

绑定后才会实例化,是延时的。

 

编译器使用模板,通过更换模板参数来创建数据类型。这个过程就是模板实例化(Instantiation)。
  从模板类创建得到的类型称之为特例(specialization)。 
  模板实例化取决于编译器能够找到可用代码来创建特例(称之为实例化要素,
  point of instantiation)。
  要创建特例,编译器不但要看到模板的声明,还要看到模板的定义。
  模板实例化过程是迟钝的,即只能用函数的定义来实现实例化。

 

所以将类模板的实现文件放在.h里,main函数包含该.h文件,当main函数用到该模板的特例化时

通过该.h就可以找到所有模板的实例化了。连接也没问题。

© 著作权归作者所有

共有 人打赏支持
secondtonone1

secondtonone1

粉丝 5
博文 38
码字总数 53981
作品 1
东城
高级程序员
私信 提问
STL入门导论[原+译]

STL入门引导 涉及到的源码:http://download.csdn.net/detail/nuptboyzhb/4239649 STL主要有以下六个大的部分: l 迭代器(iterators) 迭代器可以理解为一个模板指针;迭代器技术能够使程序...

长平狐
2012/10/08
123
0
C++ 模板惯用法

原文:C++ 模板惯用法 作者:Breaker 关于 C++ 模板编程的惯用法,note-to-self + keynote + idiom case + cross-reference 式笔记 目录 模板语法 模板惯用法示例 堆栈上分配 编译优化的开关...

晨曦之光
2012/05/23
1K
0
泛型编程与设计新思维

作者: 徐景周 转帖: http://www.vckbase.com/document/viewdoc/?id=955 前言 永远记住,编写代码的宗旨在于简单明了,不要使用语言中的冷僻特性,耍小聪明,重要的是编写你理解的代码,理解...

ValueError
2011/01/12
339
1
C++17 标准正式发布:开发者可更简单地编写和维护代码

昨日,ISO C++ 委员会正式发布了 C++ 17 标准,正式名称为 ISO/IEC 14882:2017。 基于 C++ 11,C++ 17 旨在使 C++ 成为一个不那么臃肿复杂的编程语言,以简化该语言的日常使用,使开发者可以...

局长
2017/12/06
7.5K
43
C++的include里面不带.h是设计失误?

前几天某人说:C++的头文件不带.h其实是设计失误。 给出了如下的理由: 旧的编译器的模板类的实现和声明必须放在同一文件内不然会有bug。这并不是什么值得提倡的事情…… 然后我就十分想不明...

東條・スペンサー・咲
2015/04/18
2.5K
10

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
7
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
7
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
8
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
4
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部