如何将派生对象置于地图中

dyr*_*dal 5 c++ c++11

我还是C++的新手,遇到了一个我似乎无法在地图中插入新派生类的问题.

我的代码简化如下:

std::map<int, std::unique_ptr<Base_Class> > m;

void func(){
  for(int num = 0; num < 100; n++){
    m.emplace(num, new Derived_Class() );
  }  

}
Run Code Online (Sandbox Code Playgroud)

这给了我这个:

error: no matching function for call to 'std::pair <const int, std::unique_ptr<Base_Class> >::pair(int&, Derived_Class*)
Run Code Online (Sandbox Code Playgroud)

我尝试过使用失败:

m.emplace(std::pair(num, new Derived_Class()) );
Run Code Online (Sandbox Code Playgroud)

这给了我这个:

error: no matching function for call to 'std::pair<const int, std::unique_ptr<Base_Class> >::pair(std::pair<int, Derived_Class*>)
Run Code Online (Sandbox Code Playgroud)

我似乎无法想出这个,并希望得到任何帮助.

Sto*_*ica 5

m.emplace(num, std::unique_ptr<Derived_Class>(new Derived_Class()));
Run Code Online (Sandbox Code Playgroud)

将是要走的路.由于unique_ptr构造函数采用原始指针是显式的,因此无法从a隐式初始化Derived_Class*.您需要显式创建一个unique_ptr要放置的对象.

我提出这个解决方案,因为你提到了,但真正有利的方法是使用std::make_unique<Derived_Class>()(及以后),既避免重复自己,又创建unique_ptr"atomic".