2009-11-25 18 views
18

में कुंजी प्रकार के रूप में उपयोग किया जा सकता है क्या मैं std::map बना सकता हूं जहां कुंजी प्रकार एक संदर्भ प्रकार है, उदा। Foo & और यदि नहीं, तो क्यों नहीं?क्या एक संदर्भ प्रकार एसटीएल मानचित्र

+1

से +1 एक अच्छा सवाल है कि कई पूछने से डरते हैं। – laura

+3

सीधे नहीं, लेकिन 'boost :: context_wrapper ' काम करना चाहिए। इसका 'फू और ' – MSalters

उत्तर

14

सी ++ मानक 23.1.2/7 key_type के अनुसार असाइन किया जाना चाहिए। संदर्भ प्रकार नहीं है। std :: नक्शे के लिए एक महत्वपूर्ण प्रकार के रूप में

4

नहीं, क्योंकि std :: map में कई फ़ंक्शन कुंजीपटल का संदर्भ लेते हैं और संदर्भों के संदर्भ C++ में अवैध हैं।

/ए.बी.

1

operator[](const key_type & key) पर विचार करें। यदि key_typeFoo & है तो const key_type & क्या है? बात यह है कि यह काम नहीं करता है। आप एक std :: मानचित्र नहीं बना सकते जहां कुंजी प्रकार एक संदर्भ प्रकार है।

1

सूचक पूरी तरह से कानूनी

#include <iostream> 
#include <cstdlib> 
#include <map> 

using namespace std; 


int main() 
{ 
int a = 2; 
int b = 3; 
int * c = &a; 
int * d = &b; 
map<int *, int> M; 

M[c]=356; 
M[d]=78; 
return 0; 
} 

initialised संदर्भ नहीं कर सकते कुंजी हो रहा है:

#include <iostream> 
#include <cstdlib> 
#include <map> 

using namespace std; 


int main() 
{ 
int a = 2; 
int b = 3; 
int & c = a; 
int & d = b; 
map<int &, int> M; 

M[c]=356; 
M[d]=78; 
return 0; 
} 
In file included from /usr/include/c++/4.4/map:60, 
       from test.cpp:3: 
/usr/include/c++/4.4/bits/stl_tree.h: In instantiation of 'std::_Rb_tree<int&, std::pair<int&, int>, std::_Select1st<std::pair<int&, int> >, std::less<int&>, std::allocator<std::pair<int&, int> > >': 
/usr/include/c++/4.4/bits/stl_map.h:128: instantiated from 'std::map<int&, int, std::less<int&>, std::allocator<std::pair<int&, int> > >' 
test.cpp:14: instantiated from here 
/usr/include/c++/4.4/bits/stl_tree.h:1407: error: forming pointer to reference type 'int& 

'

+1

पर एक निहित रूपांतरण है ध्यान रखें कि पॉइंटर्स के आधार पर ऑर्डरिंग गैर-निर्धारिती है और कार्यक्रम के प्रत्येक आमंत्रण के साथ बदलने की संभावना है। –

+1

उल्लेख नहीं है कि चाबियाँ समानता के लिए तुलना की जाती हैं, और इसलिए यह लुकअप करते समय पॉइंटर पता मानों की तुलना कर रहा है, और पॉइंटर-मूल्य की तुलना नहीं करता है। विशेष रूप से, इस उदाहरण में यदि कोई अन्य int e = 2 था, और आपने एम [& e] देखा, तो आपको वह नहीं मिलेगा जो आप सोच सकते हैं कि आप ढूंढ रहे हैं। – mmocny

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