使用unique_ptr进行强制转换的正确方法

时间:2014-11-28 02:59:53

标签: c++ smart-pointers

我正在尝试编译以下代码但是我收到此错误:

错误:无法从'unique_ptr'转换为'unique_ptr'

我要做的是创建一个包装某些对象的智能指针,然后将它们用作侦听器。

#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;
}

任何想法都会受到欢迎!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

unique_ptr

没有复制构造函数

来自cppreference.com:

“对于unique_ptr类型的对象禁用了复制构造(请参阅移动构造函数,6和7)。”

您必须明确地移动它,或者提取原始指针并将其复制到