对于给定的函数名,可以有非模板函数、模板函数和显示具体化模板函数以及它们的重载版本。
显示具体化的原型和定义应以template<>开头,并通过名称来指出类型。
具体化将覆盖常规模板,而非模板函数将覆盖具体化和常规模板。
#include <iostream>
template<class Any>
void swap(Any& , Any&);
struct Job
{
char name[40];
double salary;
int floor;
};
template<> void swap<Job>(Job&, Job&);
void show(Job&);
int main()
{
using namespace std;
cout.precision(2);
cout.setf(ios::fixed, ios::floatfield);
int i = 10, j = 20;
cout << "i, j = " << i << ", " << j << ".\n";
swap(i, j);
cout << "Now i, j = " << i << ", " << j << ".\n";
Job sue = {"Susan Yaffee", 73000.60, 7};
Job sidney = {"Sidney Taffee", 78060.72, 9};
cout << "Before job swapping: \n";
show(sue);
show(sidney);
swap(sue, sidney);
cout << "After job swapping: \n";
show(sue);
show(sidney);
system("pause");
return 0;
}
template <class Any>
void swap(Any& a, Any& b)
{
/*
a = a+b;
b = a-b;
a = a-b;
*/
a = a|b;
b = a^b;
a = a^b;
}
template<> void swap<Job>(Job& j1, Job& j2)
{
double t1;
int t2;
t1 = j1.salary;
j1.salary = j2.salary;
j2.salary = t1;
t2 = j1.floor;
j1.floor = j2.floor;
j2.floor = t2;
}
void show(Job& j)
{
using namespace std;
cout << j.name << ": $" << j.salary\
<< " on floor" << j.floor << endl;
}
这是第三代具体化,编译器不一定支持。如果无法编译通过,提示有多个可用实例,可以将
template<> void swap<Job>(Job&, Job&)替换成void swap(int&, int&)