Compartir a través de


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
};