- 函数模板特例化:
当我们特例化一个函数模板时,必须为原模版中的每个模板参数都提供实参。如下:
template<typename T,typename T1>
void f1(T &a,T1& a)
{}
template<>void f1(int &a,double &b){}//函数模板实例化
- 类模板特例化
类模板特例化时不用为全部模板参数提供实参,即类模板部分特例化。也可以特例化成员而不是整个类。
特例化的类模板必须与原始模板定义在同一个命名空间中,如下:
① 指定类模板的所有参数,即整个模板类都特例化
namespace n1
{
template<typename T1,typename T2>
class c1
{
public:
c1(){std::cout<<"template class c1"<<endl;}
};
}
namespace n1
{
template<>class c1<int,int> //指定所有模板参数
{
int a;
public:
c1();
};
}
n1::c1<int,int>::c1(){}//类外定义c1<int,int>的构造函数
②
只实例化某个模板类的成员函数
template<>
n1::c1<int,double>::c1(){}//只实例化c1<int,double>::c1()函数,即只实例化某个成员函数,template<>可以不写
③ 类模板部分特例化
template<typename T1,typename T2>
class c1
{
};
template<typename T>
class c1<double, T>//部分特例化,即第一个参数是特定的double
{
int a;
};