इस कोड पर MSVC, Clang और GCC असहमत हैं:
struct Base { int x; };
struct Der1 : public Base {};
struct Der2 : public Base {};
struct AllDer : public Der1, public Der2 {
void foo() {
Der1::Base::x = 5;
}
};
जीसीसी:
<source>: In member function 'void AllDer::foo()':
<source>:10:21: error: 'Base' is an ambiguous base of 'AllDer'
10 | Der1::Base::x = 5;
| ^
Compiler returned: 1
क्लेंग एक समान त्रुटि देता है, और MSVC कोई त्रुटि नहीं देता है।
यहाँ कौन सही है?
मुझे लगता है कि यह [class.member.lookup] में कवर किया गया है , लेकिन मुझे यह समझने में कठिनाई है कि यह मुझे इस मामले के लिए क्या बताने की कोशिश कर रहा है। कृपया संबंधित भागों को उद्धृत करें और यदि संभव हो तो सादे अंग्रेजी में समझाएं।
पुनश्च: इस प्रश्न से प्रेरित है कि बेस क्लास के संदर्भ में अस्पष्ट के साथ :: -ऑपरेटर गर्त व्युत्पन्न वर्ग क्यों है?
PPS: वास्तव में मेरा संदेह यह है कि क्या Der1::Base
प्रकार को संदर्भित करता है, जो होगा Base
(और फिर Der2::Base
ठीक उसी प्रकार का है), या उप-विषय पर। मुझे विश्वास है कि यह पहला है, लेकिन अगर यह बाद का है तो MSVC सही होगा।
::Base
, लेकिन असली सवाल यहां थोड़ा अलग है। दो प्रकार के उप-विषय हैं Base
, और दोनों में एक Base::x
सदस्य है।