2015-11-08 9 views
12

के रूप में बनाना एक std :: unordered_map को std :: pair के साथ कुंजी के रूप में बनाने का प्रयास कर रहा हूं। जैसा कि आप कल्पना कर सकते हैं, इसके लिए मुझे किसी दिए गए कुंजी के लिए हैश उत्पन्न करने के लिए एक वर्ग प्रदान करने की आवश्यकता होगी, साथ ही चाबियों के लिए समानता तुलनित्र भी होगा।एक std :: unordered_map को std :: pair के साथ कुंजी

In file included from /usr/include/c++/5/bits/hashtable.h:35:0, 
       from /usr/include/c++/5/unordered_map:47, 
       from prog.cpp:1: 
/usr/include/c++/5/bits/hashtable_policy.h: In instantiation of 'struct std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> >': 
/usr/include/c++/5/type_traits:137:12: required from 'struct std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > >' 
/usr/include/c++/5/type_traits:148:38: required from 'struct std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
/usr/include/c++/5/bits/unordered_map.h:100:66: required from 'class std::unordered_map<std::pair<int, int>, std::unique_ptr<GraphEdge>, PairHash<int, int>, PairEqual<int, int> >' 
prog.cpp:29:43: required from here 
/usr/include/c++/5/bits/hashtable_policy.h:85:34: error: no match for call to '(const PairHash<int, int>) (const std::pair<int, int>&)' 
    noexcept(declval<const _Hash&>()(declval<const _Key&>()))> 
           ^
prog.cpp:7:12: note: candidate: size_t PairHash<T, U>::operator()(const std::pair<_T1, _T2>&) [with T = int; U = int; size_t = unsigned int] <near match> 
    size_t operator()(const std::pair<T, U> &key){ 
      ^
prog.cpp:7:12: note: passing 'const PairHash<int, int>*' as 'this' argument discards qualifiers 
In file included from /usr/include/c++/5/bits/move.h:57:0, 
       from /usr/include/c++/5/bits/stl_pair.h:59, 
       from /usr/include/c++/5/utility:70, 
       from /usr/include/c++/5/unordered_map:38, 
       from prog.cpp:1: 
/usr/include/c++/5/type_traits: In instantiation of 'struct std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >': 
/usr/include/c++/5/bits/unordered_map.h:100:66: required from 'class std::unordered_map<std::pair<int, int>, std::unique_ptr<GraphEdge>, PairHash<int, int>, PairEqual<int, int> >' 
prog.cpp:29:43: required from here 
/usr/include/c++/5/type_traits:148:38: error: 'value' is not a member of 'std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > >' 
    : public integral_constant<bool, !_Pp::value> 
            ^
In file included from /usr/include/c++/5/unordered_map:48:0, 
       from prog.cpp:1: 
/usr/include/c++/5/bits/unordered_map.h: In instantiation of 'class std::unordered_map<std::pair<int, int>, std::unique_ptr<GraphEdge>, PairHash<int, int>, PairEqual<int, int> >': 
prog.cpp:29:43: required from here 
/usr/include/c++/5/bits/unordered_map.h:100:66: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef __umap_hashtable<_Key, _Tp, _Hash, _Pred, _Alloc> _Hashtable; 
                   ^
/usr/include/c++/5/bits/unordered_map.h:107:45: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::key_type key_type; 
              ^
/usr/include/c++/5/bits/unordered_map.h:108:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::value_type value_type; 
              ^
/usr/include/c++/5/bits/unordered_map.h:109:48: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::mapped_type mapped_type; 
               ^
/usr/include/c++/5/bits/unordered_map.h:110:43: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::hasher hasher; 
             ^
/usr/include/c++/5/bits/unordered_map.h:111:46: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::key_equal key_equal; 
              ^
/usr/include/c++/5/bits/unordered_map.h:112:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::allocator_type allocator_type; 
               ^
/usr/include/c++/5/bits/unordered_map.h:117:45: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::pointer pointer; 
              ^
/usr/include/c++/5/bits/unordered_map.h:118:50: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::const_pointer const_pointer; 
               ^
/usr/include/c++/5/bits/unordered_map.h:119:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::reference reference; 
              ^
/usr/include/c++/5/bits/unordered_map.h:120:52: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::const_reference const_reference; 
                ^
/usr/include/c++/5/bits/unordered_map.h:121:46: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::iterator iterator; 
              ^
/usr/include/c++/5/bits/unordered_map.h:122:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::const_iterator const_iterator; 
               ^
/usr/include/c++/5/bits/unordered_map.h:123:51: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::local_iterator local_iterator; 
               ^
/usr/include/c++/5/bits/unordered_map.h:124:57: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::const_local_iterator const_local_iterator; 
                 ^
/usr/include/c++/5/bits/unordered_map.h:125:47: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::size_type size_type; 
              ^
/usr/include/c++/5/bits/unordered_map.h:126:52: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     typedef typename _Hashtable::difference_type difference_type; 
                ^
/usr/include/c++/5/bits/unordered_map.h:280:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     operator=(initializer_list<value_type> __l) 
    ^
/usr/include/c++/5/bits/unordered_map.h:379:2: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
    emplace(_Args&&... __args) 
^
/usr/include/c++/5/bits/unordered_map.h:432:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     insert(const value_type& __x) 
    ^
/usr/include/c++/5/bits/unordered_map.h:439:2: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
    insert(_Pair&& __x) 
^
/usr/include/c++/5/bits/unordered_map.h:499:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     insert(initializer_list<value_type> __l) 
    ^
/usr/include/c++/5/bits/unordered_map.h:645:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     equal_range(const key_type& __x) 
    ^
/usr/include/c++/5/bits/unordered_map.h:649:7: error: 'value' is not a member of 'std::__not_<std::__and_<std::__is_fast_hash<PairHash<int, int> >, std::__detail::__is_noexcept_hash<std::pair<int, int>, PairHash<int, int> > > >' 
     equal_range(const key_type& __x) const 
    ^

क्या मैं गलत कर रहा हूँ: यह मेरे एक नहीं बल्कि (मेरी आँखों के लिए कम से कम) गूढ़ संकलक त्रुटि देता है

#include <unordered_map> 
#include <memory> 
#include <utility> 

template <class T, typename U> 
struct PairHash{ 
    size_t operator()(const std::pair<T, U> &key){ 
     return std::hash<T>()(key.first)^std::hash<U>()(key.second); 
    } 
}; 

template <class T, typename U> 
struct PairEqual{ 
    bool operator()(const std::pair<T, U> &lhs, const std::pair<T, U> &rhs) const{ 
     return lhs.first == rhs.first && lhs.second == rhs.second; 
    } 
}; 

struct GraphEdge{ 

}; 


int main(){ 

    std::unordered_map<std::pair<int, int>, 
         std::unique_ptr<GraphEdge>, 
         PairHash<int, int>, 
         PairEqual<int, int>> edges; 

} 

हालांकि,: यहाँ मेरी कोड अब तक है?

+0

एक तरफ ध्यान दें, यह इतना कठिन है कि यह stl से जुड़ी कंपाइलर त्रुटियों को समझना है। आपको यह समझने के लिए जर्नल पढ़ने की जरूरत है कि त्रुटियां क्या हैं, शेष नेस्टेड नाम हैं। जब आप Intellisense में प्रोटोटाइप को पढ़ने का प्रयास करते हैं तो वही समस्या। यह कष्टप्रद है। –

+0

आपका कोड VS2015 के साथ मेरे लिए संकलित करता है। –

उत्तर

5

जाहिर है, libstdC++ आपके हैश ऑब्जेक्ट को const PairHash<int, int>* के माध्यम से संदर्भित करता है। इस प्रकार operator() को कॉल करना जो आपके प्रोग्राम में const चिह्नित नहीं है एक संकलक त्रुटि है।

operator()const बनाकर आप libstdC++ के साथ संकलित करने के लिए अपना कोड प्राप्त कर सकते हैं।

17.6.3.4 (हैश आवश्यकताएं) के रूप में, एक हैश प्रकार को size_t operator(KeyType) const; प्रदान करना होगा, इसलिए आपका कोड वास्तव में गलत है।

+0

मुझे यकीन नहीं है कि std :: verbiage :: 17.6.3.4 - 2 '[हैश.रेक्वायरमेंट्स]' क्या करना है ** दी गई कुंजी प्रकार एच के फ़ंक्शन ऑब्जेक्ट्स के लिए एक तर्क प्रकार है, तालिका 26 एच में प्रकार का मान (संभवतः कॉन्स) एच है, आप प्रकार कुंजी का एक स्तर है, और k एक प्रकार का परिवर्तनीय (संभावित रूप से स्थिर) कुंजी का मान है । **। क्या "संभवतः कॉन्स्ट" का अर्थ है कि आपको 'कॉन्स्ट' ऑपरेटर() की आपूर्ति करनी चाहिए? –

+0

धन्यवाद! यह एक शर्म की बात है कि मैंने उसे पकड़ नहीं लिया। मेरी इच्छा है कि संकलक त्रुटि थोड़ा और पठनीय था। मैं उम्मीद करता हूं कि इस तरह की एक छोटी संकलक त्रुटि को ठीक करने में सक्षम हो। – balajeerc

+0

@CaptainGiraffe सही दिखता है, मुझे और सावधानीपूर्वक पढ़ने की आवश्यकता है। धन्यवाद। –

2

आपको अपने कस्टम फ़ैक्टर में operator() एक कॉन्स विधि बनाने की आवश्यकता है।

+0

पिछले उत्तर में जोड़ने के बिना डुप्लिकेट करें। टिप्पणी के लिए – rwst

+3

@rwst धन्यवाद। यदि आप उन समयों की जांच करते हैं जो मुझे लगता है कि आप पाएंगे कि मेरा उत्तर पहले लिखा गया था –

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