写过模板的朋友也许知道,一个模板程序,当编译器看到模板定义时并不立即产生代码,只有在我们用到模板,并对其实例化的时候,才会产生特定的实例。此时,编译器就要访问定义模板的源代码了。如果源代码不可访问,当然,编译器会报错的。记得我初学的时候,采用的是直接将声明和实现全部放在一个.h里面这个方法。但是,有时候我们确实想在.h文件中声明,在CPP文件中实现,从而实现文件分离。那么下面我就写写一般模板函数,模板类,模板特化的文件分离,我自己的心得。
在《C++primer》 中讲解了C++ 编译模板代码的两种模型 :(1)包含编译 (2)分别编译
(1)包含编译模型:可以通过在声明函数模板或类模板的头文件中添加一条#include指示使定义可用,从而引入包含相关定义的源文件
// header file utlities.h #ifndef UTLITIES_H #define UTLITIES_H template <class T> int compare(const T&, const T&); ...... #include "utilities.cpp" #endif
//implementation file utlities.cpp template <class T> int compare(const T &v1,const T &v2) { //implemente ...... }
这一策略,实现了头文件和源文件的分离
(2)分别编译: 在分别编译模式下,函数模板的声明被放在头文件中。在这种模式下,函数模板声明和定义的组织方式与程序中的非内联函数的声明和定义组织方式相同。分别编译模型 只是在使用了关键字"export"来告诉编译器模板定义在哪里引用.
如果在头文件类声明中使用了export,则该头文件只能被源文件使用一次;如果在实现文件中使用了export,有下面两种用法