1.5 模板实例化

实例化的定义:

指在编译或链接时生成函数模板或类模板的具体实例源代码,即用使用模板时的实参类型替换模板类型参数(还有非类型参数和模板型参数);

有点类似于C语言中的宏来生成代码。

实例化的方式

  • 隐式实例化(implicit instantiation):当使用实例化的模板时自动地在当前代码单元之前插入模板的实例化代码,模板的成员函数一直到引用时才被实例化;
  • 显式实例化(explicit instantiation):直接声明模板实例化,模板所有成员立即都被实例化;

实例化也是一种偏特化,被称为实例化的特例(instantiated (or generated) specialization)。

隐式实例化

由于隐式实例化的存在,也就是编译的报错会推迟,导致出错信息特别长。

template<typename T>
class X { };
template<typenmae T>
class Y { };
template<typename T>
class Z {
public:
X<Y> x_;
};

可以发现这个依赖链条比较长Z->X->Y,如果一旦出错,那么这个编译出错信息会特别长。所以针对模板而言,尽量在做测试时将其实例化掉。尽早发现编译错误。