コンパイラ エラー C2247
'class' で 'class' から継承するために 'specifier' が使用されているので、'identifier' にアクセスできません
identifier
は、プライベート または保護されたアクセスで宣言されたクラスから継承されます。
次の例では C2247 が生成されます。
// 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
このエラーは、Visual Studio .NET 2003 でコンパイラ準拠作業で、保護されたメンバーのアクセスの制御の結果として生成されることもあります。 保護されたメンバー (n) には、(n) がメンバーであるクラス (A) から継承されたクラス (B) のメンバー関数経由でのみアクセスできます。
Visual Studio .NET 2003 と Visual Studio .NET バージョンの両方の Visual C++ で有効なコードでは、メンバーを型のフレンドとして宣言します。 パブリック継承も使用できます。
// 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 は、Visual Studio .NET 2003 で実行されたコンパイラの準拠作業で、プライベート基底クラスのアクセス不可の結果として生成される可能性もあります。 型 (B) のプライベート基底クラスであるクラス (A) には、B を基底クラスとして使用する型 (C) によるアクセスが不可である必要があります。
Visual Studio .NET 2003 と Visual Studio .NET の両方のバージョンの Visual C++ で有効なコードにするには、スコープ演算子を使用します。
// 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;
}
};