2016-12-01 117 views
1

我不明白为什么下面的代码由于emplace_back的“错误”使用而无法编译。你能告诉我它有什么问题,以及我可以使用哪种解决方法?emplace_back on std :: vector

#include <vector> 

class Test { 
private: 
    std::size_t n_; 
    std::vector<double> a_; 
    std::vector<double> b_; 

public: 
    Test(std::size_t n, std::initializer_list<std::size_t> list) 
     : n_(n), a_(list.begin()[0]), b_(list.begin()[1]){}; 
}; 

int main() { 
    Test t{5, {3, 4}}; 

    std::vector<Test> v; 
    v.emplace_back(5, {3, 4}); 

    return 0; 
} 
+0

使用v.emplace_back(测试(5, {3,4}));将一个Test对象添加到矢量 – berendeanicolae

+0

[OT]:如果初始化程序列表应该总是大小为2,则考虑使用std :: array 或用两个参数替换 –

+0

@piotr:这段代码显然是一个真正的代码。我比它更简单,我同意它看起来很愚蠢。 – InsideLoop

回答

5

{3,4}这里没有类型,因此,你需要明确说明您所使用的初始化列表,像这样:

v.emplace_back(5, std::initializer_list<std::size_t>{3, 4}); 
+2

'{3,4}'* *有*类型。只是它是'std :: initializer_list ',而不是所需的'std :: initializer_list '。 –

+0

我很困惑,为什么它没有类型,为什么当我直接构造Test t时它有一个类型。 – InsideLoop

+0

@MartinBonner我试图改变测试构造函数来接受initializer_list - 仍然不工作 – Starl1ght