0

私は木のような構造を持っています

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

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

merge は、dir 内の各サブディレクトリをディレクトリに移動します。すべてのキーとディレクトリをコピーせずにこれを行うことはできますか?

私は言ってみました

auto i=dir.begin();
while(i!=dir.end())
    {
    directories.insert(std::move(*i));
    ++i;
    }

コピー不可タイプの Key では、これは Key の削除された copy ctor エラーで失敗します。問題を解決しますか?その場合、その方法をサポートしていない 4.8 より古い gcc の回避策を使用するにはどうすればよいですか?

編集:イテレータによって返されるキーが const であることがわかりました。キーを変更しないでください。これにより、ルックアップが失敗します。しかし、キーはもう必要ないので、この場合、最初に非 const に型キャストしても安全かどうか疑問に思います。

型キャストを使用したコンパイル例

型キャストなしの非コンパイル例

4

1 に答える 1

0

代わりに次のことをするつもりだったと思います:

  while(i!=dir.directories.end()) {
    directories.insert(std::move(*i));
    ++i;
  }

directoriesこのままでは、おそらく空である現在のマップのエントリをループしています。これにより、代わりにディレクトリがループされ、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;
};

それはあなたが望んでいたものですか?

于 2013-08-06T18:30:42.123 に答える