C++ 将对象移动到std::map c++;

C++ 将对象移动到std::map c++;,c++,move-semantics,stdmap,C++,Move Semantics,Stdmap,我有一个树状结构 class Directory { public: void merge(Directory&& dir); private: std::map<Key, Directory> directories; }; 在不可复制类型密钥上,此操作失败,密钥出现“已删除副本”错误。emplace能解决这个问题吗?如果是这样的话,我如何为不支持该方法的4.8以上的gcc使用变通方法

我有一个树状结构

class Directory
     {
     public:
         void merge(Directory&& dir);

     private:
         std::map<Key, Directory> directories;
     };
在不可复制类型密钥上,此操作失败,密钥出现“已删除副本”错误。emplace能解决这个问题吗?如果是这样的话,我如何为不支持该方法的4.8以上的gcc使用变通方法

EDIT:我发现迭代器返回的键是const,我不应该更改该键,因为这将导致查找失败。但是,我将不再需要密钥,所以现在我想知道在这种情况下,是否可以先将类型转换为non-const安全


我想你是想做以下事情:

  while(i!=dir.directories.end()) {
    directories.insert(std::move(*i));
    ++i;
  }
实际上,您正在当前
目录
映射中循环条目,该映射可能为空。这将在
dir
中的目录上循环,并将每个目录复制到本地地图中

编辑:看到你的回复了。我要编译这个:

class Directory {
public:
  void merge(Directory& dir) {
    std::map<Key, Directory>::iterator i=dir.directories.begin();
    while(i!=dir.directories.end()) {
      directories.insert(std::move(*i));
      ++i;
    }
  }

private:
  std::map<Key, Directory> directories;
};
类目录{
公众:
无效合并(目录和目录){
std::map::iterator i=dir.directories.begin();
而(i!=dir.directories.end()){
插入(std::move(*i));
++一,;
}
}
私人:
地图目录;
};

这就是您想要的吗?

您确定不需要图形吗?在您的示例中,您正在尝试填充的地图上循环。您应该在
dir
中循环文件,并将它们添加到
目录中。@user245710否。如何实现图形?我意识到我应该更多地了解数据结构。您的
键是否可以复制和分配移动?如果键删除了复制构造函数,则不会。因此,如果键没有复制构造函数,则移动失败?我想你在复制每一把钥匙。插入可能会复制它们的关键点,因此在移动后不能使用对它的引用,因为它可能会被移动破坏。
class Directory {
public:
  void merge(Directory& dir) {
    std::map<Key, Directory>::iterator i=dir.directories.begin();
    while(i!=dir.directories.end()) {
      directories.insert(std::move(*i));
      ++i;
    }
  }

private:
  std::map<Key, Directory> directories;
};