2014-11-28 4 views
1

Я пытаюсь скомпилировать следующий код, но я получаю эту ошибку:Правильный способ бросить с помощью unique_ptr

ошибка: нет жизнеспособного преобразование из «unique_ptr» до «unique_ptr»

Что я m пытается сделать, это создать умный указатель, который обертывает некоторые объекты, а затем использует их как слушателей.

#include <iostream> 
#include <vector> 
#include <memory> 

class Table { 

    public: 
    struct Listener{ 
     virtual void handle(int i) = 0; 
    }; 

    std::vector<std::unique_ptr<Listener>> listeners_; 

    void add_listener(std::unique_ptr<Listener> l){ 
     listeners_.push_back(l); 
    } 

}; 


struct EventListener: public Table::Listener { 
    void handle(int e){ 
    std::cout << "Something happened! " << e << " \n"; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    Table table; 
    std::unique_ptr<EventListener> el; 
    table.add_listener(el); 

    return 0; 
} 

Любые идеи будут оценены!

+0

это не обязательно устранить проблему, но уникальные указатели должны быть перемещены не копируются. – BlamKiwi

+0

Возможный обман http://stackoverflow.com/q/11002641/3093378 – vsoftco

ответ

2

std::unique_ptr не могут быть скопированы, только Перенесено: вы можете использовать std::move:

#include <iostream> 
#include <vector> 
#include <memory> 

class Table { 

    public: 
    struct Listener{ 
     virtual void handle(int i) = 0; 
    }; 

    std::vector<std::unique_ptr<Listener>> listeners_; 

    void add_listener(std::unique_ptr<Listener> l){ 
     listeners_.push_back(std::move(l)); 
    } 

}; 


struct EventListener: public Table::Listener { 
    void handle(int e){ 
    std::cout << "Something happened! " << e << " \n"; 
    } 
}; 

int main(int argc, char** argv) 
{ 
    Table table; 
    std::unique_ptr<EventListener> el; 
    table.add_listener(std::move(el)); 

    return 0; 
} 

Live demo

0

Там не конструктор копирования для unique_ptr

От cppreference.com:

"Копирование конструкции отключено для объектов type unique_ptr (см. перемещение конструкторов, 6 и 7). "

Вы должны переместить его в явном виде, или извлечения сырой указатель и скопировать его вокруг

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