2016-12-01 108 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