2013-11-24 54 views
2
#include <array> 
#include <algorithm> 

template<typename Type, unsigned int ArraySize> 
class Vector 
{ 
public: 
    std::array<Type, ArraySize> arr; 
    Vector(){ std::fill(arr.begin(), arr.end(), 0); } 
    Vector(const std::array<Type, ArraySize>& input) : arr(input){} 
}; 

#include <iostream> 

int main() 
{ 
    Vector<double, 4> a2{{1, 2, 3, 4}}; 
    std::cout << a2.arr[0]; 
    std::cout << a2.arr[1]; 
    std::cout << a2.arr[2]; 
    std::cout << a2.arr[3]; 
} 

此代碼符合在調試精在Visual Studio 2013和釋放模式,但智能感知給出了這樣的錯誤,當我編譯:Initilizer列表接受一個std ::陣列

智能感知:無構造函數的實例 「CHL ::矢量::向量與類型=雙,ARRAYSIZE = 4U]」 匹配 參數列表 參數類型有:({...})

我的問題是這樣的C++中有效的代碼?如果是這樣,我怎麼能阻止IntelliSense污染我的錯誤列表與此錯誤。

+0

你不應該需要雙括號,除非我是啞巴,在這種情況下,我可以提供大括號的最真實數量是三個:一個是'VECTOR',一個'array',以及一個用於array中的數組。雖然Brace elision被允許發生。 – chris

+0

如果我刪除雙大括號然後我得到這個錯誤'錯誤C2440:'初始化':不能從'初始化列表'轉換爲'矢量''。爲了解決這個問題,我可以把它放在圓括號內,但intellisense仍然會給出同樣的錯誤。 – Caesar

+0

三對呢?而且看起來只有一對被允許被取消。我並不太熟悉大括號規則的工作原理。 – chris

回答

2

智能感知期待3對括號:

class Vector { 
    Vector(//1 for initialization of vector 
     std::array<...> //1 for initialization and 1 for internal array 
    ); 
}; 

然而,語言允許撐省音,這意味着只有兩個就行了。我不確定爲什麼編譯器能夠捕捉到這一點,而Intellisense沒有,但是如果您使用的是CTP,它可能就像上次一樣,直到真正發佈之前,編譯器的變化纔會在Intellisense中反映出來。