这个问题可能有点粗略,因为我没有在家里可以使用代码,但是我知道这个东西,否则会在整个周末的时候出现错误.
当我尝试更新一些代码到C 11时,我开始用std :: unordered_map替换一些std :: map.代码只使用std :: map :: find()访问地图中的一个特定元素,所以我认为替换应该很简单.返回的迭代器存储在自动类型变量(auto res = map.find(x))中,所以打字应该检查出来,但是当使用res-> second.do_stuff()访问存储的元素时,我得到一个编译器错误,告诉我,struct std :: pair< char,B>没有成员第二,现在这真的让我感到困惑,但不幸的是我没有时间进一步调查.
也许这是足够的信息,所以有人可以给我一个提示这个奇怪的编译器错误.或者我的理解是,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 works std :: unordered_map不起作用任何想法为什么会是这种情况,或者可以做些什么来让它使用std :: unordered_map?
解决方法
我猜这是因为std :: unordered_map需要重新构建,因此复制元素,类型需要完成,而只有使用指向元素的地图才会出现这样的问题.
这里的解决方案是将无序映射映射到指针:
std::unordered_map<uint32_t,std::shared_ptr<Test> >.