2016-11-26 3 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

Вы не должны использовать new для создания нового unique_ptr, но использовать 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 и не объявите уникальный список в списке? –

+0

вы все равно можете использовать push_back, но тогда вам нужно использовать std :: make_unique. 'emplace_back' непосредственно вызывает конструктор' unique_ptr'. – MrTux

+0

no member named 'emplace_back' in 'std :: __ 1 :: list >, std: : __ 1 :: allocator >>> ' –

Смежные вопросы