C++模板源代码的三种组织方式

模板代码和非模板代码是有区别的,如果像非模板代码那样把模板的声明放在头文件.h中,把模板的定义放在源文件.cpp中,那么使用这个模板时会得到一个链接错误。这个错误的原因在于,模板的定义还没有被实例化。为了实例化一个模板,编译器必须知道哪一个定义应该被实例化以及使用什么样的模板参数来实例化。

我们可以用以下三种方式来组织模板代码:

1. 包含模型(Inclusion Modal)

a. 把模板的定义包含进声明模板的头文件中,如果模板声明在头文件tmpl.h中,定义在tmpl.cpp中,那可以将#include "tmpl.cpp"添加到tmpl.h文件的末尾。
b. 或者在每一个使用模板的C++文件中包含tmpl.cpp文件来达到目的。
c. 当然也可以不用.cpp文件,把模板声明和定义放在同一个.h文件里。
包含模型能够确保所有需要的模板都已经实例化,这是因为:当需要进行实例化的时候,C++编译系统会自动产生所对应的实例化体。

2. 显示实例化(Explicit  Instantiation)

显式实例化由关键字template和紧接其后的我们所需要实例化的实体(可以是类、函数、类成员函数等)的声明组成,而且该声明是一个已经用实参完全替换参数之后的声明。
a. template const int& max(const int& a, const int& b); // 函数模板的显式实例化
b. template class Array<char>; // 类模板的显式实例化
c. template unsigned int Array<char>::GetSize(); // 模板成员函数的显式实例化

3. 分离模型(Separation Modal)

C++标准还给出了另一种机制来组织模板代码:导出模板(exporting template),这种机制通常也被称为C++模板的分离模型。
分离模型只需在模板声明的.h文件里加export关键字,如:
export template <typename T> void func(const T&);
然而VC++编译器到目前为止并不支持分离模型。

posted @ 2015-07-08 22:53  C.g  阅读(1725)  评论(0编辑  收藏  举报