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

C/C++ - Integers clashing with pointers

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

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

我理解为什么会发生这种情况,但我找不到解决方案。仅当我尝试使用 VectorN(0) 实例化 class 时才会出现此问题,但当 value 不是 0 时,将使用正确的构造函数。我该怎么做才能解决这个问题?

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

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

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

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

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

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

那么 0 的问题就消失了。