这里讨论下类模板的定义和实现的编译要求。
在VC里,编译器并不要求模板类的定义和实现一定要在一个.h头文件或.cpp文件内实现(不像有些资料说的那样),但是VC的编译器要求你在调用模板的模块INCLUDE上模板所有的实现文件,仅此要求。而标准C++除此之外还支持分开编译,但是模板实现要加export,这个关键字在VC里是不支持的。
VC中类模板实现和定义分开的例子如下
/****file template.h*******/
template<class T>class mytemplate{/********/};
/****file template.cpp*******/
#include "template.h"
template<class T> mytemplate<T>::myfun(){/***/}
/****other codes***/
/******file user.cpp*******/
#include template.cpp //注意了,这里是.cpp实现文件
/****other codes******/
VC中类模板实现和定义在一个.h或.cpp中完成的例子就不用举了,这也是平时最常用的方法。
标准C++中类模板实现和定义分开的例子如下
/****file template.h*******/
template<class T>class mytemplate{/********/};
/****file template.cpp*******/
#include "template.h"
//注意,这里用export关键字,VC不支持。
export template<class T> mytemplate<T>::myfun(){/***/}
/****other codes***/
/******file user.cpp*******/
#include template.h //注意了,这里是.h声明定义文件
/****other codes******/
至于标准C++类模板实现和定义在一个.h或.cpp中完成的例子和VC是一样的。
类模板分开编译和在一个文件内实现在用户功能上是一样的,但是编译器在这两种方法上却有较大的区分。分开编译可以节省编译时间,只进行单次编译(事实上上面那种VC的分开实现方法只是感觉上的,在编译器看来和在一个文件内实现是完全一样的,所以VC编译器在对类模板永远不会单次编译)减小生成文件的大小,但是开销会稍大。而在一个.h或.cpp中完全实现一个类模板在有的时候会使生成可执行文件变的过于庞大,但是节省了一点开销。
所以说这两种方法各有利弊。在适当的时候,可根据情况做出选择。
应该提供这样一个思想:无论作为一个单位编译,还是分成一些独立的编译单位,这些代码都应能够以同样的方式进行工作。接近这种理想的方式应该是限制模板定义对其环境的依赖性,避免在进入实例化的过程中带入过多的环境信息,Bjarne如是说。在我看来,这还是从类模板的角度来强调数据的独立性吧。
初次写文,欢迎讨论!