Error del compilador C2248
'member': no se puede acceder al miembro 'access_level' declarado en la clase 'class'
Comentarios
Los miembros de una clase derivada no pueden tener acceso a private
los miembros de una clase base. No se puede acceder a private
ni protected
a los miembros de las instancias de clase.
Ejemplo
El ejemplo siguiente genera la advertencia C2248 cuando private
se accede a los protected
miembros de una clase desde fuera de la clase. Para corregir este problema, no acceda a estos miembros directamente fuera de la clase . Use public
los datos de miembro y las funciones miembro para interactuar con la clase .
// C2248_access.cpp
// compile with: cl /EHsc /W4 C2248_access.cpp
#include <stdio.h>
class X {
public:
int m_publicMember;
void setPrivateMember( int i ) {
m_privateMember = i;
printf_s("\n%d", m_privateMember);
}
protected:
int m_protectedMember;
private:
int m_privateMember;
} x;
int main() {
x.m_publicMember = 4;
printf_s("\n%d", x.m_publicMember);
x.m_protectedMember = 2; // C2248 m_protectedMember is protected
x.m_privateMember = 3; // C2248 m_privMemb is private
x.setPrivateMember(0); // OK uses public access function
}
Otro problema de conformidad que expone el error C2248 es el uso de especialización y declaraciones "friend" de plantillas. Para corregir este problema, declare plantillas de función friend mediante una lista <>
de parámetros de plantilla vacía o parámetros de plantilla específicos.
// C2248_template.cpp
// compile with: cl /EHsc /W4 C2248_template.cpp
template<class T>
void f(T t) {
t.i; // C2248
}
struct S {
private:
int i;
public:
S() {}
friend void f(S); // refer to the non-template function void f(S)
// To fix, comment out the previous line and
// uncomment the following line.
// friend void f<S>(S);
};
int main() {
S s;
f<S>(s);
}
Este es otro problema de conformidad que expone C2248: Intenta declarar un amigo de una clase, pero la clase no es visible para la declaración friend en el ámbito de la clase. Para corregir este problema, dele la condición "friend" a la clase envolvente.
// C2248_enclose.cpp
// compile with: cl /W4 /c C2248_enclose.cpp
class T {
class S {
class E {};
};
friend class S::E; // C2248
};
class A {
class S {
class E {};
friend class A; // grant friendship to enclosing class
};
friend class S::E; // OK
};