2012-05-22 14 views
7

C++のunordered_mapコンテナでオブジェクト参照をキーとして使用できるかどうかを知りたいと思います。 オブジェクト参照をstd :: 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; 

この単純なスニペットをコンパイルしようと

、私は、メソッドの再定義に関するいくつかのエラーを得た:の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]’

でのgcc 4.6を使用してのlibC++

/usr/include/c++/v1/unordered_map:352:12: error: class member cannot be redeclared

size_t operator()(const _Cp& __x) const

と打ち鳴らすを使用して

代わりに古いgnu hash_mapを使用すると(__gnu_cxx :: hash_map)、この問題は発生しません。

新しい標準によっていくつかの制限が課せられていますか?その場合、なぜですか?

この制限を回避する方法はありますか?

答えて

10

この制限を回避するには、新しい標準でstd:reference_wrapper<T>が定義されています。

T&に暗黙的に変換され、透明であることを保証します。同様の参照は、nullという状態がないことを保証しますが、参照とは異なり、再配置することができます。

詳細はUsing std::reference_wrapper as key in std::mapをご覧ください。

関連する問題