为什么具有2个参数的模板不能与具有一个参数的模板相同

时间:2017-01-26 19:14:00

标签: c++ templates template-specialization partial-specialization generic-type-argument

我最近遇到了这个非常奇怪的问题:如果我们有一个类似下面的模板类:

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天了。

非常感谢!!!

0 个答案:

没有答案