2016-11-26 20 views
-1

可能であれば、unique_ptrのリストにオブジェクトをどのように戻すことができるのだろうかと思っていました。unique_ptr push_backとstd :: list

私はエラーが発生します:

error: 
    no matching constructor for initialization of 
    'std::__1::unique_ptr<tester::Stimulation, 
    std::__1::default_delete<tester::Stimulation> >' 
      ::new ((void*)__p) _Tp(__a0); 

私のコードは次の通りである:

#include <iostream> 
#include <list> 

namespace tester 
{ 
    class Stimulation 
    { 
    std::string name; 

    public: 
    Stimulation(std::string n) : name(n) {} 
    std::string getName() const {return name;} 
    }; 
} 

using namespace tester; 


int main(int argc, char const *argv[]) 
{ 
    std::list< std::unique_ptr<tester::Stimulation*> > configuration; 
    //std::list< std::unique_ptr<tester::Stimulation> >::iterator i = configuration.begin(); 

    configuration.push_back(std::unique_ptr<tester::Stimulation>(new Stimulation("NAME1"))); 


    return 0; 
} 
+0

コードに問題がありますか? – wasthishelpful

+0

わかりませんが、あなたのコードはわかります。関連するエラーメッセージを投稿してください。 – Rakete1111

+0

更新:エラーあり –

答えて

0

新しいunique_ptrを作成するためにnewを使用しますが、使用しないでくださいstd::make_unique(例えば、std::make_unique<Stimulation>("NAME1"))。

私は中間を作成しないために

configuration.emplace_back("NAME1"); 

にしてください(http://en.cppreference.com/w/cpp/container/vector/emplace_back参照; emplace_backは、コンストラクタを呼び出すことで、リストに直接新しいオブジェクトを作成します)。

+0

emplace_backを使用して、リスト内の一意のptrを宣言しないでください。 –

+0

あなたはまだpush_backを使うことができますが、std :: make_uniqueを使う必要があります。 'emplace_back'は' unique_ptr'のコンストラクタを直接呼び出します。 – MrTux

+0

'std :: __ 1 :: list 、 std: :__ 1 :: allocator >> '' –

関連する問題