这个问题可能有点粗略,因为我家里没有可用的代码,但我知道这件事在整个周末都会让我感到烦恼。
当我尝试将某些代码更新为C ++ 11时,我开始用std::map
替换一些std::unordered_map
。代码仅使用std::map::find()
来访问地图中的特定元素,因此我认为替换应该很容易。返回的迭代器存储在auto
类型的变量(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
一起使用?
答案 0 :(得分:16)
我想因为std :: unordered_map需要重新散列,因此需要复制元素,所以需要完成类型,而地图只使用指向元素的指针,不会出现这个问题。
这里的解决方案是为指针提供无序映射:
std::unordered_map<uint32_t, std::shared_ptr<Test> >.
答案 1 :(得分:12)
使用不完整类型的map
和unordered_map
涉及未定义的行为:
特别是,在以下情况下效果未定义:
[...]
- 如果在实例化模板组件时将不完整类型(3.9)用作模板参数,除非特别允许该组件。