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

reference

模板代码和非模板代码是有区别的,如果像非模板代码那样把模板的声明放在头文件.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; // 类模板的显式实例化
  • c. template unsigned int Array::GetSize(); // 类模板成员函数的显式实例化

3. 分离模型(Separation Modal)

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值