2011-08-26 2 views
16

선언 할 때 개인적으로 상속 된 기본 클래스에서 "이 컨텍스트 내에서 액세스 할 수 없음"오류가 발생하는 다음 링크에서 설명한 것과 비슷한 문제가 있습니다. 파생 클래스 내부의 기본 클래스의 멤버 : : : X와 http://bytes.com/topic/c/answers/164246-private-inheritance-renders-class-inaccessible개인 컨텍스트가이 컨텍스트에서 "액세스 할 수없는"기본 클래스를 숨김 오류

명시 적으로 참조 X는 위의 경우에 작동하지만, 어떤 코드는 다음과 같은 기능에있는 경우 :

void fooby() 
{ 
    class X {}; 

    class Y : private X {}; 

    class Z : public Y 
    { 
    public: 
     X x; // compiler "inaccessible within this context" error 
    }; 
}; 

방법 이 경우 X를 참조합니까?

fooby가 struct/class 인 경우 :: fooby :: X가 작동하지만 위의 경우 어떻게 수행해야할지 모르겠습니다.

+0

같은 유형의 멤버 클래스와 기본 클래스를 모두 갖고 싶습니까? 대체 제안이 도움이 될지도 모릅니다. –

+0

@ 마크 B - 이것은 내가 이해하려고하는 행동을 설명하기위한 단순한 인위적인 예일뿐입니다. –

답변

10

당신이 직면하고있는 문제는 아니다 X를 참조하는 주입 식별자 Y에서 X (모든 파생 된 유형), 있다는 것입니다 네임 스페이스 수준에서 선언 된 사용자 정의 형식의 일반적인 경우 Y.

아래에 접근, 당신은 유형을 한정 네임 스페이스를 사용하여 액세스를 얻을 수 있습니다 : 당신이 아칸소 때문에

class X {}; 
class Y : X {}; 
class Z : Y { 
    ::X x;   // or Namespace::X 
}; 

을 유효한 옵션이 아닌 함수 안에 타입을 정의한다.

다른 방법으로 문제를 해결할 수 있습니다.

typedef class X {} another_name; 
class Y : X {}; 
class Z : Y { 
    another_name x; 
}; 

또는 파생 유형 유형을 제공하기 위해 Y 내부 typedef을 추가 할 수 있습니다 : @Eugene 제안으로, 당신은 X를 참조하는 다른 식별자를 만들 수 있습니다

class X {}; 
class Y : X { 
public: 
    typedef X X; 
}; 
class Z : Y { 
    X x; 
}; 

이 마지막 옵션의 작품 왜냐하면 X 식별자를 인 Y 안에 추가하고 타입을 참조하기 때문에 컴파일러는 그 타입을 찾아서 Z에 사용할 것입니다.

+0

+1 훌륭한 답변과 나는 다른 방식으로'클래스 '를 사용하는 것에 대해 배웠습니다. –

+0

"다음 옵션"("클래스 X x;")이 잘못되었습니다. 그것은 작동하지 않을 것입니다. 이것은 단지 동일하며, 개인적으로 상속되어 접근 할 수없는 주입 된 클래스 이름을 나타냅니다. 주입 된 클래스 이름이 유형이 아니라 객체라는 오해가있는 것 같습니다. 삽입 된 클래스 이름은 클래스를 참조하며 유형 이름입니다. –

+0

@Johannes : 예, 당신은 제가 그 오해를 가지고 있다는 점에서 옳습니다. 실제로 표준에서 이것을 보려고했습니다 (g ++는 4.2/4.7을 허용하지만 clang ++ 및 comeau는이를 거부합니다). 'class X x;'와'identity :: type' 모두 실패합니다. –

9

좋은 질문이지만, 그렇게 할 수있는 방법을 찾을 수 없습니다. 내가 볼 수있는 유일한 옵션은 Z의 형식 정의 외부를 소개하는 것입니다 :

typedef X PITA; 
class Z : public Y 
{ 
public: 
    PITA x; // ok 
}; 
관련 문제