参见英文答案 >
Why is it not possible to overload class templates?3个
有时我想写两个模板,如:
有时我想写两个模板,如:
template <typename Type1> class A{ ... }; template <typename Type1,typename Type2> class A{ ... };
但似乎有两个共享相同名称但具有不同参数的模板是非法的.我必须把它命名为A_1,A_2.我认为如果我可以这样做,特别是在实现Functors时可能会有用.
为什么C不允许这样?在某些情况下难以实施或模糊吗?这会在以后的C版本上得到支持吗?
解决方法
它非常有用,但就像你说的那样,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给出一个很好的错误消息).
使用默认模板参数(设置为空虚拟结构,或无效)可以在C 03中实现类似的功能,但C 11版本的IMO更好.