这个问题可能有点含混不清,因为我在家里没有代码可用,但我知道如果不解决它,整个周末都会困扰着我。
当我尝试将一些代码更新到C++11时,我开始用std::unordered_map
替换一些std::map
。该代码仅使用std::map::find()
来访问映射中的特定元素,因此我认为替换应该很容易。返回的迭代器存储在一个auto
类型的变量(auto res = map.find( x )
)中,因此类型检查应该良好。然而,当我使用res->second.do_stuff()
访问存储的元素时,我得到了一个编译器错误,告诉我struct std::pair<char, B>
没有成员second。现在这真的让我困惑了,但不幸的是,我没有时间进一步调查。
也许这已经足够提供信息,以便有人可以给我一些关于这个奇怪的编译器错误的提示了。或者我的理解std::map
和 std::unordered_map
应该具有相同的接口,除了需要排序的部分不正确吗?
编辑:
正如我承诺的那样,在这里对问题进行了更多分析。现在很可能有人可以更好地帮助我解决了。从评论中的提示,我猜测这不是由我访问映射中的元素引起的,而是由代码的其他部分引起的。我发现的原因是,我在Class X内使用map来存储指向Class 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
一起工作?
std::unordered_map
:http://ideone.com/P2XUastd::map
:http://ideone.com/etuCH - Gene Bushuyev