为什么不能重载类模板?

读这个问题让我怀疑:是否有一个技术原因不允许类模板重载?

通过重载,我的意思是有几个相同名称的模板,但不同的参数,例如

template <typename T> struct Foo {}; template <typename T1, typename T2> struct Foo {}; template <unsigned int N> struct Foo {}; 

编译器pipe理处理重载的函数和函数模板,是不是可以应用类模板相同的技术(例如名称修改)?

起初,我认为也许这会在单独使用模板标识符时造成一些模糊性问题,但唯一可能发生的情况是将其作为模板模板parameter passing,因此可以使用参数的types来select适当的超载:

 template <template <typename> class T> void A {}; template <template <unsigned int> class T> void B {}; A<Foo> a; // resolves to Foo<T> B<Foo> b; // resolves to Foo<N> 

你认为这样的function可能有用吗? 是否有一些“好”(即技术)的原因,为什么这是不可能在当前的C + +?

“完整指南模板” ( Amazon )中的第12.5节包含以下引用:

你可能会奇怪,为什么只有类模板可以部分专业化。 原因大多是历史的。 可能为函数模板定义相同的机制(参见第13章)。

在某些方面,重载函数模板的效果是相似的,但也有一些细微的差别。 这些差异主要与以下事实有关:在遇到使用时需要查找主模板。 之后才会考虑专业化,以确定应该使用哪个实施。

相比之下,所有重载的函数模板都必须通过查找来引入重载集合,并且它们可能来自不同的名称空间或类。 这增加了无意中重载模板名称的可能性。

相反,也可以允许一种类模板重载的forms。 这里是一个例子:

 // invalid overloading of class templates template<typename T1, typename T2> class Pair; template<int N1, int N2> class Pair; 

但是,似乎没有这种机制的迫切需要。

此外, C ++ ( Amazon ) 的devise和演变在15.10.3节中包含了这个引用

因此,我认为我们需要一个“专门化模板”的机制,这可以通过接受一般的重载或者通过一些更具体的机制来完成,我select了一个特定的机制,因为我认为我主要是针对由C中的不规则造成的违规,超载的情况总是会引起一阵抗议,我试图保持谨慎和保守, 现在我认为这是一个错误 ,原来定义的专业化是一种限制性的,反常的超载forms,与其他语言不相配。

大胆重视我的。 我认为这是因为function重载决议比类专业更难实现(并且被用户正确地使用)。 所以可能没有真正的技术障碍(类似于function模板部分专业化),而是一个历史事故。

您不能“重载”types参数,非types参数和模板模板参数,但可以专门设置可变参数模板:

 template <typename... T> struct Foo; template <typename T1> struct Foo<T1> {}; template <typename T1, typename T2> struct Foo<T1,T2> {};