不明确的模板类构造函数

时间:2013-09-10 18:36:27

标签: c++ templates constructor ambiguous

我正在实现一个N维数组库。请考虑以下代码:

template<int Rank, class Type>
class Array {
{
public:
    // constructor for vectors, valid when Rank==1
    Array(int dim0, Type val = Type());

    // constructor for matrices, valid when Rank==2
    Array(int dim0, int dim1, Type val = Type());
    ...
}

问题是如果Type == int,编译器会抱怨模糊的构造函数调用(例如,Array<1,int>(1,1))。是否有像enable_if这样的技巧会使编译器忽略与Rank不匹配的构造函数? (请不要使用C ++ 11)

谢谢

1 个答案:

答案 0 :(得分:1)

您可以使用模板专业化:

template<int size, class Type>
class Array {
// General stuff for size > 2, if you have any
};


template <class Type>
class Array<1, Type>
{
// Code for one-dimensional array
};


template <class Type>
class Array<2, Type>
{
// Code for two-dimensional array
};

或者甚至为int指定它:

template <>
class Array<2, int>
{
// Code for two-dimensional integer array
};

他们拥有完全不同的公共接口集也是完全有效的。

但我可能会传递给定尺寸的数组或std::vector或删除第三个参数,只需添加一个方法,比如populate(Type t)来完成这个技巧(它也可能有用)不仅仅是为了建造)。