2010-11-23 23 views
13

के लिए टाइप आवश्यकताएं आज मैंने एक नक्शा बनाया, जहां मान प्रकार का कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है। मुझे आश्चर्य हुआ कि मैं इस मानचित्र में तत्वों को सम्मिलित करने के लिए ऑपरेटर [] का उपयोग नहीं कर सका, लेकिन मुझे सम्मिलित विधि का उपयोग करना पड़ा।std :: map

तो, std :: map के लिए कुंजी और मूल्य प्रकारों के लिए वास्तव में क्या आवश्यकताएं हैं?

#include <map> 

struct A 
{ 
    A(int){} 
}; 

int main() 
{ 
    std::map< int, A > m; 
    A a1(2); 
    A a2(3); 
    A a3(4); 
    m[5] = a1; 
    m[3] = a2; 
    m[2] = a3; 
} 

मैं इस तरह के संकलन कर रहा हूँ:

[[email protected] tmp]$ g++ b5.cpp -Wall -Wextra -ansi -pedantic 
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stl_map.h: In member function ‘_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&) [with _Key = int, _Tp = A, _Compare = std::less<int>, _Alloc = std::allocator<std::pair<const int, A> >]’: 
b5.cpp:14: instantiated from here 
/usr/lib/gcc/i386-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/stl_map.h:419: error: no matching function for call to ‘A::A()’ 
b5.cpp:5: note: candidates are: A::A(int) 
b5.cpp:4: note:     A::A(const A&) 

उत्तर

8

operator[] वास्तव में डिफ़ॉल्ट-constructibility की आवश्यकता होती है क्योंकि इस प्रक्रिया में जनादेश का अर्थ विज्ञान है कि अगर कुंजी नहीं है

यहाँ कम उदाहरण है अभी तक मौजूद है, एक उचित प्रविष्टि बनाई गई है। इस प्रकार:

map<TKey, TValue> mymap; 
TKey foo = …; 
TValue& x = mymap[foo]; 

पैदा करेगा और एक नया वस्तु TValue() अगर foo मानचित्र में मौजूद नहीं है की दुकान है, और यह करने के लिए एक संदर्भ के लौटने। http://www.sgi.com/tech/stl/

असल में, यह कहता है कि नक्शा ले जाता है अनिवार्य 2 प्रकार तर्क हैं, तो Key और Data कि:

5

इस साइट के लिए एक महान एसटीएल संदर्भ बनाते हैं। डैनियल ने कहा, DataAssignable होना चाहिए। Key, हालांकि, Compare प्रकार के साथ उपयोग किया जा सकता है, उदाहरण के लिए उपयोग किया जा सकता है, यानी Compare एक फ़ंक्शन ऑब्जेक्ट निर्दिष्ट करता है जिसका पैरामीटर Key टाइप करता है। इस मामले में, डिफ़ॉल्ट Compare फ़ंक्शन ऑब्जेक्ट std::less<T> है, जो Strict Weak Ordering है जो का उपयोग कर T प्रकार की वस्तुओं की तुलना करता है। इसलिए, अगर आप Compare प्रकार, अर्थात् डिफ़ॉल्ट का उपयोग नहीं बदलते हैं, std::less<T> प्रकार Key साथ इस्तेमाल किया जाएगा, और इस तरह operator< प्रकार Key साथ इस्तेमाल किया जाएगा, और इस तरह Keyoperator< के साथ तुलनीय की जरूरत है।

आशा है कि मदद करता है! मुझे पता है कि यह थोड़ा सा अनावश्यक है और मेरा मतलब यह नहीं है कि मैं संवेदनात्मक हूं, लेकिन मैं यह सुनिश्चित करना चाहता हूं कि यह बिल्कुल स्पष्ट है कि इस बारे में तर्क के बारे में कैसे जाना है।

+2

सिद्धांत रूप में यह एक अच्छा जवाब है लेकिन यह स्पष्ट नहीं करता है कि ओपी का कोड क्यों विफल हुआ। –

+0

@ कोनराड आह, लेकिन ऐसा इसलिए है क्योंकि मैंने इसका जवाब दिया था इससे पहले कि उसने अपने त्रुटि संदेश पोस्ट किए। वह उस बिंदु पर पोस्ट किया गया था कि यह अभी काम नहीं किया था। – blwy10

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