मैंने हाल ही में एक विषम मुद्दे में भाग लिया जहां मुझे const_iterator
की अपेक्षा की गई iterator
की बजाय एक मल्टीसेट के माध्यम से पुनरावृत्ति हो रही थी। यह पता चला ++ मुझे एक त्रुटि दे दी MSVC लेकिन जी के लिए एक गैर मुद्दा:सी ++ मानक: मल्टीसेट में अप्रत्याशित const_iterator
error: invalid initialization of reference of type 'myPtr&' from expression of type 'const boost::shared_ptr'
प्रासंगिक कोड:
typedef std::multiset<myPtr> myList;
myList _mystuff;
void tick(float dt)
{
for (myList::iterator i = _mystuff.begin(); i != _mystuff.end(); ++i)
{
myPtr &mine = *i; // g++ problem here, not for MSVC
// const myPtr &mine = *i; works fine for g++
mine->tick(dt);
}
}
अनुसंधान के काफी एक सा पता चला है कि पिछली चर्चा के बहुत सारे के साथ एक समस्या है । मैं इन प्रासंगिक बिट पाया:
- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14990
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#322
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#103
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#279
- http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-closed.html#528
मेरी पृष्ठभूमि ज्ञान और इस मुद्दे पर काबू सीमित है और इस तरह मैं था यह जानना कि मानक इसे परिभाषित नहीं करता है या नहीं व्यवहार अच्छी तरह से पर्याप्त है जिसमें जी ++ और एमएसवीसी व्यवहार को अपनी पसंद के अनुसार लागू करते हैं या फिर जी ++ या एमएसवीसी एक अच्छी तरह से परिभाषित मानक से विचलित हो।
अग्रिम धन्यवाद।
परिवर्तन 'स्थिरांक myPtr और mine' को 'मेरी' की डीईसीएल। बेशक, 'टिक' को 'शून्य टिक (फ्लोट) कॉन्स घोषित किया जाना चाहिए;' और टिक द्वारा संशोधित किसी भी डेटा सदस्य को 'उत्परिवर्तनीय' होना आवश्यक होगा। – KitsuneYMG