Freigeben über


Compilerfehler C2248

"member": Kann nicht auf "access_level"-Mitglied zugreifen, das in der Klasse "Klasse" deklariert ist.

Hinweise

Elemente einer abgeleiteten Klasse können nicht auf Member einer Basisklasse zugreifen private . Sie können nicht auf Klasseninstanzen oder protected Member von Klasseninstanzen zugreifenprivate.

Beispiel

Im folgenden Beispiel wird C2248 generiert, wenn private außerhalb der Klasse auf protected Elemente einer Klasse zugegriffen wird. Um dieses Problem zu beheben, greifen Sie nicht direkt außerhalb der Klasse auf diese Member zu. Verwenden Sie public Memberdaten und Memberfunktionen, um mit der Klasse zu interagieren.

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

Ein weiteres Konformitätsproblem, das C2248 verfügbar macht, ist die Verwendung von Vorlagenfreunden und Spezialisierung. Um dieses Problem zu beheben, deklarieren Sie Freund-Funktionsvorlagen, indem Sie entweder eine leere Vorlagenparameterliste <> oder bestimmte Vorlagenparameter verwenden.

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

Hier ist ein weiteres Konformitätsproblem, das C2248 verfügbar macht: Sie versuchen, einen Freund eines Kurses zu deklarieren, aber die Klasse ist für die Deklaration des Freundes im Bereich der Klasse nicht sichtbar. Um dieses Problem zu beheben, gewähren Sie der eingeschlossenen Klasse Freundschaft.

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