gpt4 book ai didi

c++ - 使用对象引用作为 std::unordered_map 中的键

转载 作者:可可西里 更新时间:2023-11-01 16:36:29 27 4
gpt4 key购买 nike

我想知道是否可以在 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: error: class member cannot be redeclared

size_t operator()(const _Cp& __x) const

将 gcc 4.6 与 libstdc++ 结合使用

/usr/include/c++/4.6/bits/hashtable_policy.h:556:5: error: ‘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]’ cannot be overloaded

/usr/include/c++/4.6/bits/hashtable_policy.h:537:5: error: 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]’

如果我改用旧的 gnu hash_map (__gnu_cxx::hash_map),我就没有这个问题。

这是新标准强加的一些限制吗?如果是,为什么?

有没有办法解决这个限制?

最佳答案

新标准定义std:reference_wrapper<T>解决此限制。

它可以隐式转换为 T&这样它是透明的,并且像引用文献一样保证没有null状态,但是与引用不同,它可以重新定位。

更多信息请参见 Using std::reference_wrapper as key in std::map .

关于c++ - 使用对象引用作为 std::unordered_map 中的键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10703852/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com