2017-08-31 24 views
-3
class Complex{ 
public: 
    Complex(int a, int b): real(a), imag(b){} 
    ~Complex(){} 
private: 
    int real; 
    int imag; 

}; 

int main() 
{ 
    vector<Complex> vec1 {1,2,3,4}; //Why can't be recognize in C++11 
    vector<Complex> vec2 {{1,2},{4,6}}; 

} 

看看上面的代碼的initializer_list,我定義一個類複雜的,它需要在構造函數中2 PARAM。然後我定義了2個矢量,爲什麼vec1不能被識別,編譯器不能把它當作vec1 {{1,2},{3,4}}?如何編譯治療載體<Type>這<Type>具有多PARAMATERS

+0

簡短的答案是因爲C++不能這樣工作。 –

+1

即使在人類中混淆的可能性也很大。對於不經意的讀者,應該是(1,0),(2,0),(3,0),(4,0)? (1,2),(3,4)?第二個強迫你寫出你的意思,這是值得的黃金重量。 – user4581301

+0

但實際上,Complex構造函數需要2個參數,我告訴向量的類型是,爲什麼編譯器不能將{1,2}分配給Complex1,{3,4}到vec1中的Complex2? –

回答

0

std::vector<Complex> v{1, 2, 3, 4}是一條聲明,它試圖將initailizer_list<int>傳遞到向量的構造中。這顯然是一個錯誤。當您改爲使用{ {1, 2}, {3, 4} }時,它會哄騙初始化程序列表以構建一組Complex類以傳入您的向量。

+0

我不相信你的第一個主張是真實的。 – Yakk

+0

'v {1,2,3,4}'不會嘗試使用'initializer_list '構造向量。首先優先考慮向量的'initializer_list '構造函數,但這不是一個匹配項,因爲無法從braced-init-list中的每個參數構造一個Complex。一旦失敗,剩下的'vector '構造函數就會被枚舉,這些構造函數都不匹配,編譯失敗。 – Praetorian

+0

我同意Praetorian。 複數(int a,int b = 0):real(a),imag(b){} 如果我寫這樣的構造函數,默認爲imag,那麼vec1是有效的,所有的元素都是{ 1,0},{2,0},{3,0},{4,0}, ,它進入Complex構造函數。 但我只是想知道爲什麼編譯器不會分配第一個2參數{1,2}複雜構造函數,如複雜(1,2)。 –