为什么C ++不允许模板重载?

时间:2013-12-09 03:56:53

标签: c++ templates

有时我想写两个模板,如:

template <typename Type1>
class A{
    ...
};

template <typename Type1, typename Type2>
class A{
    ...
};

但似乎两个模板共享相同名称但具有不同参数是非法的。我必须将其命名为A_1A_2。我认为如果我可以这样做,特别是在实现Functors时可能会有用。

为什么C ++不允许这样做?在某些情况下难以实施或模糊吗?这将在更高版本的C ++上得到支持吗?

2 个答案:

答案 0 :(得分:12)

它非常有用,但就像你说的那样,C ++不允许你直接这样做。但是,您可以使用部分特化进行几乎相同的操作。

如果您在C ++ 11中使用可变参数模板,这一点特别容易,因为您可以执行以下操作:

template <typename... T>
struct A; // Declared but not defined

template <typename T, typename U>
struct A<T, U>
{
    // definition of the two-parameter case
};

template <typename T>
struct A<T>
{
   // definition of the one-parameter case
};

实际上,这允许您将A<T, U>A<T>作为完全独立的类型。尝试使用更多模板参数实例化A将导致编译错误,因为一般情况未定义(如果需要,可以使用static_assert给出一个很好的错误消息。)

使用默认模板参数(设置为空虚拟结构或void)可以在C ++ 03中实现类似的功能,但C ++ 11版本的IMO更好。

答案 1 :(得分:0)

一个简单(可能)的解决方案是为第二个模板参数设置默认值。 这样你只能实现一个模板,你可以用一个模板参数调用它,并使用默认的第二个,或者覆盖默认值。