컴파일러 오류 C2247

'class'는 'specifier'를 사용하여 'class'에서 상속하기 때문에 '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;
}

Visual Studio .NET 2003에 대해 수행된 컴파일러 규칙 작업의 결과로 C2247을 생성할 수도 있습니다. 이제 프라이빗 기본 클래스에 액세스할 수 없습니다. 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;
   }
};