Compilerfehler C2247
Auf "Bezeichner" kann nicht zugegriffen werden, da "Klasse" "Bezeichner" verwendet, um von "Klasse" zu erben.
identifier
wird von einer Klasse geerbt, die mit privatem oder geschütztem Zugriff deklariert ist.
Im folgenden Beispiel wird C2247 generiert:
// C2247.cpp
class A {
public:
int i;
};
class B : private A {}; // B inherits a private A
class C : public B {} c; // so even though C's B is public
int j = c.i; // C2247, i not accessible
Dieser Fehler kann auch als Ergebnis der Compilerkonformität generiert werden, die für Visual Studio .NET 2003 ausgeführt wurde: Zugriffssteuerung mit geschützten Membern. Auf ein geschütztes Element (n) kann nur über eine Memberfunktion einer Klasse (B) zugegriffen werden, die von der Klasse (A) erbt, von der sie (n) ein Mitglied ist.
Deklarieren Sie für Code, der sowohl in visual Studio .NET 2003- als auch in Visual Studio .NET-Versionen von Visual C++ gültig ist, das Mitglied als Freund des Typs. Öffentliche Vererbung kann auch verwendet werden.
// C2247b.cpp
// compile with: /c
// C2247 expected
class A {
public:
void f();
int n;
};
class B: protected A {
// Uncomment the following line to resolve.
// friend void A::f();
};
void A::f() {
B b;
b.n;
}
C2247 kann auch als Ergebnis der Compilerkonformität generiert werden, die für Visual Studio .NET 2003 ausgeführt wurde: Auf private Basisklassen kann jetzt nicht zugegriffen werden. Eine Klasse (A), die eine private Basisklasse für einen Typ (B) ist, sollte nicht für einen Typ (C) zugänglich sein, der B als Basisklasse verwendet.
Verwenden Sie für Code, der sowohl in visual Studio .NET 2003 als auch in Visual Studio .NET-Versionen von Visual C++ gültig ist, den Bereichsoperator.
// C2247c.cpp
// compile with: /c
struct A {};
struct B: private A {};
struct C : B {
void f() {
A *p1 = (A*) this; // C2247
// try the following line instead
// ::A *p2 = (::A*) this;
}
};