隐式实例化:
编译器在需要对象之前,不会生成类的隐式实例化
显式实例化:
使用关键字template并指出所需类型来声明类的时候,编译器将生成类声明的显式实例化:
在这种情况下,虽然没有创建类对象,编译器也将生成类,包括方法定义.
显式具体化:
(显式具体化==特型)在需要特殊要求的时候对模板进行修改,使其行为不同,这时可以创建显式具体化.
书上举的栗子:
假设现在定义一个表示排序后数组的类:
假设模板使用>运算符来对值进行比较,对于数字来说没毛病,对于类型T,只要定义了T::operator>(),也没毛病,但是T如果是个const char **的字符串就不行了,因为这需要使用strcmp(),而不是>*.
这种情况下可以提供一个现实模板具体化.
格式如下:
当具体化模板和通用模板都与实例化请求匹配时,编译器将使用具体化模板.
所以说要使用const char 类型的SortedArray*模板可以这么写:
这样在使用const char **类型的SortedArray*模板时将使用上述专用定义而不是用通用模板定义.
部分具体化:
部分具体化可以给类型参数制定具体的类型:
template后面的是没有被具体化的类型参数.上述T2被具体化为int,但T1不变.
部分具体化特型使得能够设置各种限制,例如:
template 后面的是没有被具体化的类型参数
给出上述定义编译器将作出如下选择: