我想知道是否可以在 C++ 的 unordered_map 容器中使用对象引用作为键。
#include <unordered_map>
class Object {
int value;
};
struct object_hash {
inline size_t operator()(const Object& o) const { return 0; }
};
std::unordered_map<Object&, int, object_hash> map;
在尝试编译这个简单的代码片段时,我遇到了一些关于方法重新定义的错误:
在 libc++ 中使用 clang
/usr/include/c++/v1/unordered_map:352:12:错误:无法重新声明类成员
size_t operator()(const _Cp& __x) const
将 gcc 4.6 与 libstdc++ 一起使用
/usr/include/c++/4.6/bits/hashtable_policy.h:556:5:错误:'std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std ::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator [with _Key = Object&, _Pair = std::pair, _Hashtable = std::_Hashtable, std::allocator >, std::_Select1st >, std::equal_to, object_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail ::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]'不能重载
/usr/include/c++/4.6/bits/hashtable_policy.h:537:5 : 错误: with 'std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type& std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::operator[](const _Key&) [with _Key = Object&, _Pair = std::pair, _Hashtable = std: :_Hashtable, std::allocator >, std::_Select1st >, std::equal_to, object_hash, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash, std::__detail::_Prime_rehash_policy, false, false, true>, std::__detail::_Map_base<_Key, _Pair, std::_Select1st<_Pair>, true, _Hashtable>::mapped_type = int]'</p>
如果我改用旧的 gnu hash_map (__gnu_cxx::hash_map),我就没有这个问题。
这是新标准施加的一些限制吗?如果是,为什么?
有没有办法解决这个限制?