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 puntoR
cuando se nombra en la claseN
si
m
como miembro deN
es público, om
como miembro deN
es privado, yR
aparece en un miembro o amigo de la claseN
, om
como miembro deN
está protegido, yR
aparece en un miembro o amigo de claseN
, o en un miembro de claseP
derivado deN
, dondem
como miembro deP
es público, privado o protegido, o- existe una clase base
B
deN
que es accesible enR
, ym
es accesible enR
cuando 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