C / C ++ - 整数与指针冲突

时间:2015-08-20 21:43:15

标签: c++ pointers int

我一直在研究一个小型的图书馆馆藏,在我的n维几何向量模板课程中,我遇到了两个构造函数之间的问题。构造函数VectorN( t data[n] )与构造函数VectorN( t value )冲突,我收到错误:

More than one instance of constructor ___ matches the argument list".

我理解为什么这种情况正在发生,但解决方案却让我无法理解。只有在我尝试使用VectorN(0)实例化类时才会出现此问题,但当value为0以外的任何值时,将使用正确的构造函数。我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:5)

问题是0是一个有效的空指针常量,它是一个有效的T *(这是t data [n]实际上是在引擎盖下)。如果你真的想要采用原始C数组,请使用对数组的引用 - 这是强类型和安全的(r)。

此外,原始C数组也很糟糕。 std::array适用于您不想进行段错误的情况。

答案 1 :(得分:3)

您不正确地声明了接受C样式数组的构造函数 - 您正在丢失大小。如果你这样做:

template <class T>
class VectorN {
public:
    template<std::size_t N>
    VectorN( T (&array)[N] );
    ...
};

然后0的问题就会消失。

答案 2 :(得分:0)

如果你传递像t data[n]这样的数组,实际上你只是在数组的第一个元素上传递一个指针。所以你的第一个构造函数等于VectorN(t* data)。所以现在当你用零调用构造函数时,编译器可能会认为你想要传递空指针。

我建议你清楚地区分你的构造函数。因此,例如,因为你有一个n维向量,你必须在某处指定n。你可以做一个像VectorN(t* data, int n)这样的构造函数。比你肯定清楚你想要使用什么构造函数。