显式具体化也是基于函数模板的,只不过在函数模板的基础上,添加一个专门针对特定类型的、实现方式不同的具体化函数。
template<>void swap<job>(job &a, job &b)
{
int salary;
salary = a.salary;
a.salary = b.salary;
b.salary = salary;
}
显式实例化只需声明,不需要重新定义。编译器根据模板实现实例声明和实例定义。
在代码中包含模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例。其实模板实例就是调用模板时编译器为这个类型的参数定义了一个函数。
当显式实例化模板时,在使用模板之前,编译器根据显式实例化指定的类型生成模板实例。
隐式实例化指的是:在使用模板之前,编译器不生成模板的声明和定义实例。只有当使用模板时,编译器才根据模板定义生成相应类型的实例。、
template<class T>
void Swap(T&,T&);
template<>void Swap<job>(job &,job&);
int main()
{
template void Swap<char>(char &,char&);
short a,b;
Swap(a,b);
job n,m;
Swap(n,m);
char g,h;
Swap(g,h);
}
编译器看到char 的显示实例化后,将使用模板定义来生成Swap()的char版本。对于其他SWAP()调用,编译器根据函数调用中世纪使用的参数,生成相应的版本,例如,当编译器看到函数调用Swap(a,b)后,将生成Swap的short版本,因为两个参数的类型都是short ,当编译器看到Swap(n,m)后,将使用job类型提供的独立定义(显示具体化)。当编译器看到swap(g,h),将使用处理显示实例化时生成的模板具体化。