MSVC, Clang et GCC ne sont pas d'accord sur ce code:
struct Base { int x; };
struct Der1 : public Base {};
struct Der2 : public Base {};
struct AllDer : public Der1, public Der2 {
void foo() {
Der1::Base::x = 5;
}
};
GCC:
<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
Clang donne une erreur similaire et MSVC ne donne aucune erreur.
Qui est ici?
Je suppose que cela est couvert dans [class.member.lookup] , mais j'ai des difficultés à comprendre ce qu'il essaie de me dire pour ce cas. Veuillez citer les parties pertinentes et, si possible, expliquer en anglais simple.
PS: Inspiré par cette question Pourquoi la référence à la classe de base est-elle ambiguë avec la classe dérivée :: -operator trough?
PPS: En fait, mon doute est de savoir si Der1::Base
fait référence au type, ce serait Base
(puis Der2::Base
est exactement du même type), ou au sous-objet. Je suis convaincu que c'est le premier, mais si c'est le dernier, MSVC aurait raison.
La raison pour laquelle vous pouvez faire référence au nom de la classe en tant que membre de la classe est que cpp l'aliase pour une utilisation pratique, comme si vous aviez écrit using Base = ::Base;
à l'intérieur de la base.
Le problème auquel vous êtes confronté est que Der1::Base
est Base
.
Ainsi, lorsque vous écrivez Der1::Base::x
, c'est la même chose que Base::x
.