私は家にコードを持っていないので、この質問は少し大雑把かもしれませんが、そうでなければ週末を通して私を悩ませることになるでしょう。
一部のコードを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
ますか?