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