我最近遇到了这个非常奇怪的问题:如果我们有一个类似下面的模板类:
template<typename T>
class A
{
public:
void f(void);
void g(void);
};
我希望我的f()函数可用于任何类型的'T',但我希望g()仅在模板用'int'实例化时可用,C ++允许我进行以下函数定义:
template<typename T>
inline void A<T>::f(void)
{
//code here
}
template<>
inline void A<int>::g(void)
{
//code here
}
但是,如果我们在模板中添加另一个参数,这使得我们的类看起来像这样:
template<typename T, typename U>
class A
{
public:
void f(void);
void g(void);
};
我想要与f()和g()类似的行为,这意味着我希望f()可用于任何'T'和'U'类型,但g()仅在'U'时可用是'int'('T'仍然是通用的),我收到g()的编译错误,显然不能像以前那样部分专门化:
template<typename T, typename U>
inline void A<T, U>::f(void)
{
//code here
}
template<typename T>
inline void A<T, int>::g(void)
{
//code here
}
为什么会这样?如果在我们的第一种情况下,当我们只有一个参数时,我可以“部分地专门化”模板而不包括显式的类型(非通用的),为什么这种行为不适用于超过1个通用参数?我现在已经沉溺了6天了。
非常感谢!!!