2015-08-20 32 views
0

我一直在研究一個小型庫集合,並且在我的n維幾何矢量模板類中,我遇到了兩個構造函數之間的問題。構造函數VectorN(t data[n])衝突與構造VectorN(t value),我得到的錯誤:C/C++ - 整數碰撞指針

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

我明白爲什麼這是發生,而是一個解決方案我摸不透。只有當我嘗試使用VectorN(0)實例化類時纔會出現此問題,但是當value不是0時,將使用正確的構造函數。我能做些什麼來解決這個問題?

+2

這沒有多大意義。請發佈一個MCVE。 – juanchopanza

+1

這完全有道理。 – Puppy

+0

我無法用GCC 5.2重現這一點。一個工作測試用例是必需的。解決方案可能只是使用'VectorN((int)0)'。 – ams

回答

3

您錯誤地聲明接受C風格數組的構造函數 - 您正在放大大小。如果你這樣做是正確的:

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

然後問題0將消失。

+0

我一直在使用泛型C,因此我經常忘記一半的STL存在。我希望儘可能保持一切爲「通用」,並且不要假設他人使用的數據類型(因此使用標準C風格數組),但我猜想隱式轉換使得這一點沒有實際意義。 – TooMuchCoffee

5

問題是0是一個有效的空指針常量,它是一個有效的T *(這是t data [n]實際上是在引擎蓋下)。如果你真的想要原始C數組,那麼使用對數組的引用 - 這是強類型和安全的(r)。

此外,原始C數組是狗屎。 std::array適用於您不想段故障的情況。

0

如果你傳遞一個像t data[n]這樣的數組,實際上你只需要在數組的第一個元素上傳遞一個指針。所以你的第一個構造函數等於VectorN(t* data)。所以現在當你用零調用構造函數時,編譯器可能會認爲你想傳遞空指針。

我會建議你清楚地區分你的構造函數。例如,因爲你有一個n維向量,你必須在某處指定n。你可以做一個構造函數,如:VectorN(t* data, int n)。比它肯定清楚你想使用什麼構造函數。

+0

我想我應該更好地定義它,但N是在模板聲明中定義的。因此,一個三維浮點矢量將被定義爲「VectorN 」,並且一個Snozzberries的15維矢量將被定義爲「VectorN 」。 – TooMuchCoffee