2012-11-29 11 views
5

मैं कुछ कोड है कि मैं करने के लिए सी ++ 11 को अद्यतन करने कर रहा हूँ जीसीसी 4.7 (3.1 से)std :: multiset :: iterator = NULL अब मान्य नहीं है?

का उपयोग कर मैं एक मल्टीसेट एक वर्ग के लिए एक निजी सदस्य के रूप में परिभाषित किया गया है:

multiset <Object*, objectcomp> objects_; 

कोड में एक खंड है कि इस तरह दिखता है (p_q मल्टीसेट iterators, कि बुरा लाइन के बारे में खेद की एक जोड़ी है, को बदलने के लिए कि ऑटो के साथ, haha ​​इंतजार नहीं कर सकता) है:

void Terrain::removeObject(Object* obj){ 
    pair<multiset<Object*, objectcomp>::iterator, multiset<Object*, objectcomp>::iterator> p_q; 
    multiset<Object*, objectcomp>::iterator p,q; 
    q = NULL; 
    p_q = objects_.equal_range(obj); 
    for(p = p_q.first; p != p_q.second; p++){ 
     if(*p == obj) {q=p; break;} 
    } 
    if(q!=NULL){ 
     ... do stuff based on q no longer being null 
    } 
} 

यह अब और संकलन नहीं होंगे। क्या आप इसे फिर से शून्य करने के लिए सेट नहीं कर सकते हैं? विकल्प क्या है? (nullptr या तो काम नहीं करता है)

+9

यह ** कभी ** मान्य नहीं था। – ildjarn

+1

ओह, ठीक है कि यह शर्मनाक है, हाहा –

उत्तर

7

इटरेटर को न्यूल पर सेट करना कभी कानूनी नहीं था। हो सकता है कि आप भाग्यशाली हो गए हों क्योंकि आपका विशेष कार्यान्वयन पॉइंटर्स को उस प्रकार के इटरेटर के रूप में उपयोग करने के लिए हुआ था, लेकिन यह अभी भी अवैध था।

सही जवाब है:

q = objects_.end(); 

या, कुछ मामलों में:

q = multiset<Object*, objectcomp>::iterator(); 
+1

कोई भी जानता है कि मेरा पहला कोड ब्लॉक कोड के रूप में क्यों नहीं दिख रहा है? – abarnert

+0

कॉपी और पेस्टिंग काम नहीं कर सका ... लेकिन '_' को हटाकर, फिर काटने, फिर पेस्ट करने, ... अजीब ... – abarnert

+0

मूल रूप से आपके पास उचित रिक्त स्थान की जगह न तोड़ने वाली रिक्त स्थान थी; स्पष्ट रूप से एसओ गैर-ब्रेकिंग रिक्त स्थान को व्हाइटस्पेस इंडेंटिंग के रूप में नहीं मानता है। – ildjarn

2

तुम कभी पुनरावर्तक शून्य पर सेट कर सकते हैं। अगर उपर्युक्त कोड कभी काम करता है, तो यह बहुत दुर्घटनाग्रस्त था। मल्टीसेट के किसी भी उचित कार्यान्वयन को देखते हुए, यह देखना मुश्किल है कि यह कभी संकलित कैसे हो सकता है, अकेले चलने दें।

कंटेनर के अंत का उपयोग करना "कहीं नहीं" इटरेटर प्राप्त करने का सबसे अच्छा तरीका है। q = NULL को q = objects_.end() के साथ बदलें।

इसके अलावा, कभी भी कंटेनर में कच्चे पॉइंटर्स न डालें; यह स्मृति रिसाव के लिए एक खुला निमंत्रण है। आप लगभग multiset<Object,comp> या multiset<shared_ptr<Object>,comp> चाहते हैं।

+0

मैंने साझा_प्टर के बारे में कभी भी नहीं सुना है, मुझे लगता है कि मैं इसे देख लूंगा। ** पॉइंटर्स ** के लिए धन्यवाद। एक कंटेनर में कच्चे पॉइंटर्स का उपयोग न करने के बारे में बिंदु के लिए –

+0

+1। @EricB: [boost :: ptr_container] (http://www.boost.org/doc/libs/1_52_0/libs/ptr_container/doc/ptr_container.html) पर भी नज़र डालें, जो कंटेनर को पॉइंट- वस्तुओं के लिए। यदि वस्तुओं को कंटेनर छोड़ने के बाद जीवित रहने की आवश्यकता नहीं है (या यदि वे कंटेनर छोड़ चुके हैं तो वर्तमान दायरे के अंत तक जीवित रहने की आवश्यकता है), यह बहुत आसान (और अधिक कुशल) हो सकता है साझा पॉइंटर्स के कंटेनर से। – abarnert

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