【问题标题】:Compile error trying to put a unique_ptr into a map尝试将 unique_ptr 放入地图的编译错误
【发布时间】:2016-04-18 15:27:19
【问题描述】:

我有一个 Load-Method 可以构建我的 unique_ptr(稍后会不止一个),还有一个方法可以将这些 un​​ique_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++ 错误消息之一:

错误:使用已删除的函数 '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...

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

在 'constexpr std::pair<_t1 _t2>::pair(_U1&&, const _T2&) [with _U1 = const char (&)[5]; =无效; _T1 = 常量 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/

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您正在尝试复制不允许的 unique_ptr(该构造函数已被删除,如 gcc 在错误中所说)。取而代之的是,您可以尝试使用 std::move:

      #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

      【讨论】:

        猜你喜欢
        • 2017-03-20
        • 2012-04-03
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多