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
mes accesible en el puntoRcuando se nombra en la claseNsi
mcomo miembro deNes público, omcomo miembro deNes privado, yRaparece en un miembro o amigo de la claseN, omcomo miembro deNestá protegido, yRaparece en un miembro o amigo de claseN, o en un miembro de clasePderivado deN, dondemcomo miembro dePes público, privado o protegido, o- existe una clase base
BdeNque es accesible enR, ymes accesible enRcuando se nombra en la claseB
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