MSVC, Clang y GCC no están de acuerdo con este código:
struct Base { int x; };
struct Der1 : public Base {};
struct Der2 : public Base {};
struct AllDer : public Der1, public Der2 {
void foo() {
Der1::Base::x = 5;
}
};
CCG:
<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 da un error similar y MSVC no da ningún error.
¿Quién está aquí?
Supongo que esto está cubierto en [class.member.lookup] , pero tengo dificultades para entender lo que está tratando de decirme para este caso. Por favor, cite las partes relevantes y, si es posible, explique en inglés simple
PD: Inspirado por esta pregunta ¿Por qué la referencia a la clase base es ambigua con :: -operator a través de la clase derivada?
PPS: En realidad, mi duda es si se Der1::Base
refiere al tipo, que sería Base
(y luego Der2::Base
es exactamente el mismo tipo), o al subobjeto. Estoy convencido de que es el primero, pero si es el último, entonces MSVC estaría en lo cierto.
::Base
, pero la pregunta real parece ser ligeramente diferente aquí. Hay dos subobjetos de tipo Base
, y ambos tienen un Base::x
miembro.