问一个模版特化的语法
问一个模版特化的语法
template <class T1, class T2>
class A
{
public:
void Fun();
private:
T1 t1;
T2 t2;
};
template <class T1, class T2>
void A<T1, T2>::Fun()
{
}
现在我想对T1特化为DWORD
template <?, class T2>
void A<?, T2>::Fun<DWORD>()
{
}
请问这个Fun应该怎么定义
[解决办法]
你这个是局部特例化
template <>
void A<DWORD, T2>::Fun()
{
}
[解决办法]
你的特化是针对class A的,这样写
template <class T2>
class A<DWORD,T2>
{
public:
void Fun();
private:
DWORD t1;
T2 t2;
};
template <class T2>
void A<DWORD, T2>::Fun()
{
}
但是如果你要把T1和T2都特化了可以这样写
template <>
void A<DWORD, DWORD>::Fun()
{
std::cout<<"DWORD,DWORD fun"<<std::endl;
}
完整测试代码
template <class T1, class T2>
class A
{
public:
void Fun();
private:
T1 t1;
T2 t2;
};
template <class T1, class T2>
void A<T1, T2>::Fun()
{
std::cout<<"normal fun"<<std::endl;
}
template <class T>
class A<DWORD, T>
{
public:
void Fun(){
std::cout<<"DWORD fun"<<std::endl;
}
private:
DWORD t1;
T t2;
};
template <>
void A<DWORD, DWORD>::Fun()
{
std::cout<<"DWORD,DWORD fun"<<std::endl;
}
int main()
{
A<DWORD,int> x;
A<int,int> y;
A<DWORD,DWORD> z;
x.Fun();
y.Fun();
z.Fun();
}
输出
DWORD fun
normal fun
DWORD,DWORD fun
[解决办法]
不能偏特化函数模板,因为编译器在决定使用的普通函数、模板函数和偏特化的模板函数中的哪一个时,其规则是很奇怪的:参考Exceptional C++ Style第七条。
如果确实有需要,要么像上面说的那样,偏特化A,要不把void Fun();提取到A的外面,使之成为A的友元函数模板。