2016-01-13 60 views
0

我有一个Load-Method,它构建了我的unique_ptr(稍后会多于一个)以及将这些unique_ptr添加到我的无序地图的方法。但是,代码不编译,我想它是与作用域...编译时尝试将unique_ptr放入地图中的错误

下面是代码:

#include <unordered_map> 
#include <memory> 

class MyClass 
{ 
    public: 
     std::string Name; 
}; 

using Map = std::unordered_map<std::string,std::unique_ptr<MyClass>>; 


class MyContainer 
{ 
    private: 
     Map myMap; 
     void AddItem(std::unique_ptr<MyClass> item) 
     { 
      myMap.emplace("test", item); 
     } 
    public: 
     void LoadItems() 
     { 
      //Read a file ... do something before etc.. 
      std::unique_ptr<MyClass> someItem(new MyClass); 
      someItem->Name = "FooBar"; 
      AddItem(someItem); 
     } 
}; 

这是G ++错误消息之一:

error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = MyClass; _Dp = std::default_delete]'

使这项工作最好的方法是什么?我试图改变的AddItem-方法的签名如下所示:

void AddItem(std::unique_ptr<MyClass>& item) //takes a reference now... 

这导致了真正的神秘的错误消息:

In instantiation of 'constexpr std::pair<_T1, _T2>::pair(_U1&&, const _T2&) [with _U1 = const char (&)[5]; = void; _T1 = const std::basic_string; _T2 = std::unique_ptr]': e:\devtools\winbuilds\include\c++\4.8.3\bits\hashtable_policy.h:177:55: required from 'std::__detail::_ ...

我建议尝试这段代码就飞到这里,看到错误消息: http://cpp.sh/

回答

10

您不能复制unique_ptr,因为它不会是唯一的。你必须移动它 - AddItem(std::move(someItem));myMap.emplace("test", std::move(item));

2

您正试图复制unique_ptr这是不允许的(该构造函数被删除,因为gcc在错误中说)。取而代之的是,你可以用的std ::尝试移动

#include <unordered_map> 
#include <memory> 
#include <utility> 

class MyClass 
{ 
    public: 
     std::string Name; 
}; 

using Map = std::unordered_map<std::string,std::unique_ptr<MyClass>>; 


class MyContainer 
{ 
    private: 
     Map myMap; 
     void AddItem(std::unique_ptr<MyClass> item) 
     { 
      myMap.emplace("test", std::move(item)); 
     } 
    public: 
     void LoadItems() 
     { 
      //Read a file ... do something before etc.. 
      std::unique_ptr<MyClass> someItem(new MyClass); 
      someItem->Name = "FooBar"; 
      AddItem(std::move(someItem)); 
     } 
}; 

注意,不要事后使用移动的对象。

您可以考虑使用shared_ptr来代替。