在std :: unordered_map中使用对象引用作为键

时间:2012-05-22 14:13:16

标签: c++ c++11 libstdc++ libc++

我想知道是否可以在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;

在尝试编译这个简单的代码片段时,我遇到了一些关于方法重新定义的错误:

将clang与libc ++一起使用

  

/ usr / include / c ++ / v1 / unordered_map:352:12:错误:无法重新声明班级成员

     

size_t operator()(const _Cp&amp; __x)const

将gcc 4.6与libstdc ++一起使用

  

/ usr / include / c ++ / 4.6 / bits / hashtable_policy.h:556:5:错误:   'std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,   _Hashtable&GT; :: mapped_type&安培; std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,_Hashtable&gt; :: operator [with   _Key = Object&amp;,_ Pair = std :: pair,_Hashtable = std :: _ Hashtable,   std :: allocator&gt;,   std :: _ Select1st&gt;,std :: equal_to,   object_hash,std :: __ detail :: _ Mod_range_hashing,   的std :: __细节:: _ Default_ranged_hash,   std :: __ detail :: _ Prime_rehash_policy,false,false,true&gt;,   std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,   _Hashtable&gt; :: mapped_type = int]'无法重载

     

/ usr / include / c ++ / 4.6 / bits / hashtable_policy.h:537:5 :错误:   'std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,   _Hashtable&GT; :: mapped_type&安培; std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,_Hashtable&gt; :: operator [](const _Key&amp;)   [使用_Key = Object&amp;,_ Pair = std :: pair,_Hashtable =   的std :: _哈希表,   std :: allocator&gt;,   std :: _ Select1st&gt;,std :: equal_to,   object_hash,std :: __ detail :: _ Mod_range_hashing,   的std :: __细节:: _ Default_ranged_hash,   std :: __ detail :: _ Prime_rehash_policy,false,false,true&gt;,   std :: __ detail :: _ Map_base&lt; _Key,_Pair,std :: _ Select1st&lt; _Pair&gt;,true,   _Hashtable&gt; :: mapped_type = int]'

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

新标准是否有一些限制,如果是,为什么?

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

1 个答案:

答案 0 :(得分:11)

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

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

Using std::reference_wrapper as key in std::map中的更多信息。