10

私は家にコードを持っていないので、この質問は少し大雑把かもしれませんが、そうでなければ週末を通して私を悩ませることになるでしょう。

一部のコードをC++11に更新しようとすると、一部std::mapを。に置き換え始めましたstd::unordered_map。コードstd::map::find()はマップ内の特定の要素にアクセスするためにのみ使用されていたため、置換は簡単であるはずだと思いました。返されたイテレータはauto-typed変数(auto res = map.find( x )。さらに調査する時間。res->second.do_stuff()struct std::pair<char, B> does not have a member second

たぶんこれで十分な情報なので、誰かがこの奇妙なコンパイラエラーについてのヒントを教えてくれます。それとも、注文が必要な部分を除いて同じインターフェイスを使用する必要があることstd::mapを理解していますか?正しくありませんか?std::unordered_map

編集

ここで約束したように、問題に関するもう少しの分析。おそらくこれは誰かが今私をより良く助けることを可能にするでしょう。コメントのヒントから推測したように、これは実際にはマップ内の要素にアクセスしたポイントではなく、コードの他の部分が原因でした。私が見つけた理由は、クラスX内のマップを使用して、クラスXの他の要素(一種のツリー構造)へのポインターを格納したためです。ただし、これはでは機能するようですが、では機能しstd::mapませんstd::unordered_map。問題を示す非常に単純なコードを次に示します。

#include <stdint.h>
#include <unordered_map>
#include <map>

class Test {
  std::map<uint32_t, Test> m_map1; // Works
  std::unordered_map<uint32_t, Test> m_map; // gives error: ‘std::pair<_T1, _T2>::second’ has incomplete type
};

int main() {
  return 1;
}

std::map動作std::unordered_mapしません。これが事実である理由、またはそれを動作させるために何ができるかについてのアイデアはありstd::unordered_mapますか?

4

2 に答える 2

16

std :: unordered_mapは再ハッシュする必要があり、したがって要素をコピーする必要があるため、型は完全である必要がありますが、マップは要素へのポインターでのみ機能するため、その問題は発生しません。

ここでの解決策は、ポインタへの順序付けられていないマップを作成することです。

std::unordered_map<uint32_t, std::shared_ptr<Test> >. 
于 2011-12-13T09:52:38.850 に答える
12

と不完全な型の両方を使用するmapunordered_map、未定義動作が発生します。

特に、次の場合の影響は定義されていません。

[...]

—テンプレートコンポーネントをインスタンス化するときに、不完全な型(3.9)がテンプレート引数として使用されている場合。ただし、そのコンポーネントで特に許可されている場合を除きます。

于 2011-12-14T09:27:37.420 に答える