2011-04-12 13 views
13

나는 컴파일되지 않습니다 다음 코드 예제가 있습니다 GCC 인쇄는 것을개인 상속 : 이름 조회 오류

#include <stdio.h> 

namespace my 
{ 
    class base1 
    { // line 6 
    }; 

    class base2: private base1 
    { 
    }; 

    class derived: private base2 
    { 
    public: 
     // The following function just wants to print a pointer, nothing else! 
     void print(base1* pointer) {printf("%p\n", pointer);} 
    }; 
} 

오류 : 이제

test.cpp:6: error: `class my::base1' is inaccessible

test.cpp:17: error: within this context

을, 어떻게 문제를 추측 할 수 : print의 선언을 보면 컴파일러는 base1을보고 다음과 같이 생각합니다. base1derived* this의 기본 클래스 하위 객체이지만 액세스 할 수는 없습니다. 그 동안 base1은 형식 이름이어야합니다.

어떻게하면 C++ 표준에서 이것이 올바른 동작이며 컴파일러의 버그가 아니라는 것을 알 수 있습니까? (나는 모든 컴파일러가 제대로 작동했는지 확인했습니다.)

이 오류는 어떻게 해결해야합니까? 다음 수정 프로그램이 모두 작동하지만 어느 것을 선택해야합니까?

void print(class base1* pointer) {}

void print(::my:: base1* pointer) {}

class base1; void print(base1* pointer) {}


편집 :

int main() 
{ 
    my::base1 object1; 
    my::derived object3; 
    object3.print(&object1); 
} 
+0

당신이 주를 게시 할 수()? –

+0

개인 상속이 구성과 전혀 다른 것을 보여주는 좋은 예입니다! – curiousguy

답변

12

당신이 찾고있는 부분은 11.1이다. 그것은 사용 :: 내 :: base1 *을이 문제를 해결하기 위해 제안 :

[ Note: In a derived class, the lookup of a base class name will find the injected-class-name instead of the name of the base class in the scope in which it was declared. The injected-class-name might be less accessible than the name of the base class in the scope in which it was declared. — end note ]

[ Example: 
class A { }; 
class B : private A { }; 
class C : public B { 
A *p; 
// error: injected-class-name A is inaccessible 
:: A * q ; 
// OK 
}; 
+0

주입 된 클래스 이름이 무엇인지 설명 할 수 있습니까? – davka

+1

9 장, 포인트 2 : class-name은 class-name이 표시된 직후에 선언 된 범위에 삽입됩니다. 클래스 이름은 클래스 자체의 범위에도 삽입됩니다. 이를 주입 된 클래스 이름이라고합니다. 액세스 검사를 위해 주입 된 클래스 이름은 공개 멤버 이름 인 것처럼 처리됩니다. 클래스 지정자는 일반적으로 클래스 정의라고합니다. 클래스는 멤버 함수가 일반적으로 정의되어 있지 않아도 클래스 지정자의 닫는 중괄호를 본 후에 정의 된 것으로 간주됩니다. –

+1

@anatolyg 님이 제공 한 답변에 만족하시는 분은 다른 사람도 볼 수 있도록 허용으로 표시해 주시겠습니까? –