C ++ - unordered_map中的unique_ptr会导致错误

时间:2017-02-01 00:49:15

标签: c++ unique-ptr unordered-map

我有一个程序给了我一个模糊的错误,所以我没有发布数百行代码来制作这个简化版本:

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

struct s
{
    int height;
    std::unordered_map<std::string, std::unique_ptr<s>> children;
};

void InitWD(s &wd_ptr, int height, std::unordered_map<std::string, std::unique_ptr<s>> children) //Initialize a WindowData
{
    wd_ptr.children=children;
    wd_ptr.height=height;
}

int main()
{
  s test;
  test.height=1;
  test.children=std::unordered_map<std::string, std::unique_ptr<s>>();
  std::unique_ptr<s> ptr(new s);
  InitWD(*ptr, 2, std::unordered_map<std::string, std::unique_ptr<s>>());
  test.children.emplace("two", std::move(ptr));
}

错误(GCC 4.8 with C ++ 11)与unique_ptrunordered_map有关,我相信:

error: use of deleted function 'constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const std::basic_string<char>; _T2 = std::unique_ptr<s>]'

也许代码中某处unique_ptr被复制了?这是我能想到的唯一会导致这种错误的事情。

感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

错误在于:

wd_ptr.children=children;

这会尝试 children复制到wd_ptr.children。您需要将其更改为:

wd_ptr.children = std::move(children);

非常不幸的是,gcc和clang都无法生成实际告诉您代码哪一行出错的诊断。