2011-11-10 7 views
5

मैं वर्तमान में कुछ कोड देख रहा हूं जिसे जीसीसी के नए संस्करणों पर संकलित किया जा सकता है लेकिन पुराने लोगों पर नहीं। मेरे मामले में मैं std::back_inserter से std::copy का उपयोग कर रहा हूं, एक डेटा संरचना से कुछ डेटा एक कस्टम डेटा संरचना में। अगर मैं इस कस्टम डेटा संरचना में typedef value_type & const_reference टाइपपीफ भूल जाता हूं, तो यह जीसीसी 4.4 पर संकलित नहीं होगा। एक ही कोड संकलित करता है और जीसीसी 4.5 पर ठीक है।std :: back_inserter को पुराने जीसीसी पर const_reference की आवश्यकता है। क्यूं कर?

इन दो कंपाइलर संस्करणों के बीच क्या अंतर है, जो कोड को एक संस्करण पर संकलित करता है लेकिन दूसरे पर नहीं। मुझे लगता है कि इसका सी ++ 11 के कार्यान्वयन के साथ कुछ करना है जो जीसीसी 4.4 में बहुत कम था। शायद decltype या कोई अन्य नया C++ 11 कीवर्ड वाला कुछ, मुझे लगता है।

यह कोड भी सही है, यदि मैं का उपयोग const_reference प्रकार को परिभाषित किए बिना करता हूं? मैंने आमतौर पर सोचा था कि एसटीएल-एल्गोरिदम पुस्तकालय के साथ संगत होने के लिए किसी को टाइपपीफ (value_type, reference, const_reference आदि) का पूरा सेट लागू करना होगा? या क्या मैं सुरक्षित रूप से यह मान सकता हूं कि यदि मेरा कोड इस मामले में संकलित करता है तो मैं कुछ भी खतरनाक नहीं कर रहा हूं (उदाहरण के लिए अर्थशास्त्र चलाएं, जो मेरे अन्य डेटास्ट्रक्चर को नष्ट कर देगा)।

+0

रिकॉर्ड के लिए (शुरुआती समय की तरह शुरुआती लोगों की मदद करने के लिए): मैंने 'टाइपपीफ टी और संदर्भ जोड़ा; टाइपपीफ कॉन्स टी & const_reference; ' मेरी डेटा संरचना में, back_inserter के लिए त्रुटि c2039 चला गया है।स्पष्टीकरण के लिए –

उत्तर

6

मानक (1 99 8) का कहना है कि std::back_insert_iterator को Container::const_reference की आवश्यकता है। "24.4.2.1 खाका वर्ग back_insert_iterator" में, [lib.back.insert.iterator], यह कहते हैं:

back_insert_iterator<Container>& 
operator=(typename Container::const_reference value); 

2011 मानक केवल चाहता है Container::value_type,

back_insert_iterator<Container>& 
operator=(const typename Container::value_type& value); 
back_insert_iterator<Container>& 
operator=(typename Container::value_type&& value); 

तो, के साथ संगत होना करने के लिए सी ++ मानक के दोनों संस्करण, value_type और const_reference_type दोनों को परिभाषित करें।

दोनों जीसीसी 4.4.6 और 4.5.1 में, operator= की परिभाषा समान (libstdc++-v3/include/bits/stl_iterator.h) है:

back_insert_iterator& 
    operator=(typename _Container::const_reference __value) 
    { 
    container->push_back(__value); 
    return *this; 
    } 

और मैं दोनों compilers के साथ एक ही त्रुटि मिलती है, शायद आप दोहरी जांच करने की आवश्यकता होगी यदि आप सही कंपाइलर संस्करणों का उपयोग कर रहे हैं।

+0

धन्यवाद। 4.5.2 पर यह const_reference प्रकार के बिना काम करता है, जैसा कि मैंने अभी सत्यापित किया है। 4.4.4 अभी भी इसकी जरूरत है। – LiKao

+1

@ लीकाओ, हाल ही में जीसीसी में, सी ++ 0x लाइब्रेरी संगतता डिफ़ॉल्ट रूप से सक्षम है। जीसीसी 4.5.2 जीसीसी 4.4 की तुलना में थोड़ा * अधिक * संगत :) है कि यह केवल 'const_reference' का उपयोग करता है जब संगतता अक्षम होती है, जबकि 4.4 बिना शर्त के इसका उपयोग करता है। – chill

+0

@chill: उद्धरण [वर्तमान जीसीसी संस्करण के दस्तावेज़ीकरण] (http://gcc.gnu.org/onlinedocs/gcc-4.6.2/gcc/Standards.html# मानक): 'डिफ़ॉल्ट, यदि कोई सी ++ भाषा नहीं है बोली विकल्प दिए गए हैं, -std = gnu ++ 98.' है। तो, क्या आप निश्चित हैं कि आप क्या कहते हैं? –

1

कारण यह है कि आप की जरूरत const_reference अपने डेटा-संरचना के लिए परिभाषित किया क्योंकि है std::back_insert_iterator कक्षा में एक lvalue तर्क प्रकार के लिए जीसीसी 4.4 में असाइनमेंट ऑपरेटर के रूप में परिभाषित किया गया है: एक

template<class Container> 
back_insert_iterator<Container>& 
back_insert_iterator<Container>::operator= 
        (typename Container::const_reference value); 

इस प्रकार const_reference जरूरतों होने के लिए std::back_insert_iterator क्लास टेम्पलेट में असाइनमेंट ऑपरेटर को ठीक से चालू करने के लिए अपने क्लास-प्रकार में हल करने योग्य पहचानकर्ता।

जीसीसी 4.5 में, lvalue तर्क के लिए असाइनमेंट ऑपरेटर की इस परिभाषा क्रम नई सी ++ 11 विनिर्देश का समर्थन करने के

template<class Container> 
back_insert_iterator<Container>& 
back_insert_iterator<Container>::operator= 
       (const typename Container::value_type& value); 

को बदल दिया गया है। चूंकि आपका कोड जीसीसी 4.5 के साथ सही ढंग से संकलित करता है, इसलिए मुझे लगता है कि आपके पास value_type आपके डेटा-स्ट्रक्चर के लिए उचित रूप से परिभाषित होना चाहिए।