2017-08-31 39 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)。 –