2016-12-01 4 views
1

emplace_backの「悪い」使用のために次のコードがコンパイルされないのはなぜわかりません。あなたは何が間違っているのか、どのような回避策をとることができるのか教えてください。stplace :: vectorのemplace_back

#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}));テストオブジェクトをベクトルに追加するには – berendeanicolae

+0

[OT]:イニシャライザのリストが常に2のサイズであると仮定されている場合は、 'std :: array 'を使用するか、2つのパラメータで置き換えます。 –

+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 'ではなく 'std :: initializer_list 'です。 –

+0

私はTest tを直接構築すると、なぜここに型がないのか、それがなぜあるのか困惑しています。 – InsideLoop

+0

@MartinBonner initializer_listを受け入れるようにTestコンストラクタを変更しようとしました - まだ動作していません – Starl1ght

関連する問題