2012-05-22 17 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; 

जब इस सरल टुकड़ा संकलित करने के लिए कोशिश कर रहा है, मैं तरीकों परिभाषा के बारे में कुछ त्रुटियों मिला:

libC++

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

size_t operator()(const _Cp& __x) const

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]’

साथ जीसीसी 4.6 का उपयोग के साथ बजना का उपयोग करना अगर मैं इसके बजाय पुराने gnu hash_map का उपयोग करता हूं (__gnu_cxx :: हैश_मैप), मुझे यह समस्या नहीं है ।

क्या यह कुछ मानक नए मानक द्वारा लगाया गया है, और यदि हां, तो क्यों?

क्या इस सीमा को हल करने का कोई तरीका है?

उत्तर

10

नया मानक std:reference_wrapper<T> को इस सीमा के आसपास काम करने के लिए परिभाषित करता है।

यह T& पर स्पष्ट रूप से परिवर्तनीय है ताकि यह पारदर्शी हो, और संदर्भ की गारंटी की तरह null राज्य नहीं है, हालांकि संदर्भों के विपरीत इसे फिर से बैठे जा सकते हैं।

Using std::reference_wrapper as key in std::map में अधिक जानकारी।

संबंधित मुद्दे