在代码中申明函数模板的时候,是不会生成函数定义的,当编译器应用模板为特定类型生成函数定义时,失去的是模板实例。
例如如下代码,这样的模板并非函数定义。

template<class T>void Swap(T &a, T &b){    T temp;    temp = a;    a = b;    b = temp;}

函数模板的具体化又分为隐式实例化、显示实例化、显示具体化。
1、隐式实例化

int main(){    int a = 10, b = 20;    Swap(a, b);}

在上述代码中,函数调用Swap(i,j)导致编译器生成Swap实例,这种实例化称为隐式实例化,因为编译器之所以晓得须要进行定义,是因为程序调用了Swap函数时提供了int参数,这种实例化的形式存在效率低下的毛病,因为其无奈在程序编译时就生成函数定义。
2、显示实例化
显示实例化能够解决隐式实例化的毛病,其能够间接命令编译器创立特定的实例,其语法为如下
template void Swap<int>(int, int);
3、显示具体化
显示具体化次要针对非凡的数据类型,如构造体,其能够对底层的模板进行改变,从而使其针对这种非凡的数据类型执行特定的操作。例如以下代码,我申明了一个构造体,想要只替换构造体中的salary和floor,不替换name,就要应用显示具体化。

struct job{    char name[40];    double salary;    int floor;};template<> void Swap<job>(job&a, job&b){    double t1;    int t2;    t1 = a.salary;    a.salary = b.salary;    b.salary = t1;    t2 = a.floor;    a.floor = b.floor;    b.floor = t2;}

因而调用时,显示具体化将会优先于惯例模板。