c++ inheritance gcc clang

c++ - El error de compilación de g++ "... está protegido desde dentro de este contexto" mientras que no hay ningún error con el clang



inheritance gcc (1)

Tengo el siguiente código:

#include <iostream> class BaseClass { protected: static int x; }; int BaseClass::x; class DerivedA: public BaseClass { public: DerivedA() { x = 3; } }; class DerivedB: public BaseClass { public: DerivedB() { std::cout << DerivedA::x; } }; int main(int argc, char* argv[]) { DerivedB b; }

Compilando con g ++ ( g++ classtest.cpp ) Recibo el siguiente error:

classtest.cpp: en el constructor ''DerivedB :: DerivedB ()'':
classtest.cpp: 9: 5: error: ''int BaseClass :: x'' está protegido
int BaseClass :: x;
^ classtest.cpp: 25: 32: error: dentro de este contexto
std :: cout << DerivedA :: x;

Cuando estoy compilando con clang ++ ( clang++ classtest.cpp ) no hay ningún error.

¿Por qué g ++ está devolviendo el error de compilación?

Yo uso g ++ versión 5.1.0 y clang ++ versión 3.6.1


Error GCC. [class.access.base] / p5:

Un miembro m es accesible en el punto R cuando se nombra en la clase N si

  • m como miembro de N es público, o
  • m como miembro de N es privado, y R aparece en un miembro o amigo de la clase N , o
  • m como miembro de N está protegido, y R aparece en un miembro o amigo de clase N , o en un miembro de clase P derivado de N , donde m como miembro de P es público, privado o protegido, o
  • existe una clase base B de N que es accesible en R , y m es accesible en R cuando se nombra en la clase B

N es DerivedA , m es x , R es el constructor de DerivedB . Existe una clase base BaseClass de DerivedA que se puede acceder en R , y x nombrada en la clase BaseClass (es decir, BaseClass::x ) es claramente accesible en R , por lo que, mediante el cuarto punto, DerivedA::x es accesible en R