尝试将unique_ptr放入映射时编译错误

Dou*_*oid 1 c++ c++11

我有一个Load-Method来构建我的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);
        }
};
Run Code Online (Sandbox Code Playgroud)

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

错误:使用已删除的函数'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...
Run Code Online (Sandbox Code Playgroud)

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

在实例化'constexpr std :: pair <_T1,_T2> :: pair(_U1 &&,const _T2&)[与_U1 = const char(&)[5]; =无效 _T1 = const std :: basic_string; _T2 = std :: unique_ptr]':e:\ devtools\winbuilds\include\c ++\4.8.3\bits\hashtable_policy.h:177:55:'std :: __ detail :: _ ...

我建议在这里动态尝试这段代码,以查看错误消息:http: //cpp.sh/

Bo *_*son 11

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