模板实例化是生成采用特定模板参数组合的具体类或函数(实例)。例如,编译器生成一个采用 Array<int> 的类,另外生成一个采用 Array<double> 的类。通过用模板参数替换模板类定义中的模板参数,可以定义这些新的类。在前面“类模板”一节介绍的 Array<int> 示例中,编译器用 int 替换所有 Elem。
使用模板函数或模板类时需要实例。如果这种实例还不存在,则编译器隐式实例化模板参数组合的模板。
编译器仅为实际使用的那些模板参数组合而隐式实例化模板。该方法不适用于构造提供模板的库。C++ 提供了显式实例化模板的功能,如以下示例所示。
要显式实例化模板函数,请在 template 关键字后接函数的声明(不是定义),且函数标识符后接模板参数。
template float twice<float>(float original); |
在编译器可以推断出模板参数时,模板参数可以省略。
template int twice(int original); |
要显式实例化模板类,请在 template 关键字后接类的声明(不是定义),且在类标识符后接模板参数。
template class Array<char>; |
template class String<19>; |
显式实例化类时,所有的类成员也必须实例化。
要显式实例化模板类函数成员,请在 template 关键字后接函数的声明(不是定义),且在由模板类限定的函数标识符后接模板参数。
template int Array<char>::GetSize(); |
template int String<19>::length(); |
要显式实例化模板类静态数据成员,请在 template 关键字后接成员的声明(不是定义),且在由模板类限定的成员标识符后接模板参数。
template int String<19>::overflows; |