2011-05-12 2 views
14

클래스 A가 클래스 B를 친구로 선언하는 코드는 다음과 같습니다. 클래스 B 내에서 선언 된 클래스 C가 클래스 A의 private 선언/멤버를 볼 수 있어야합니까?클래스의 "friend"는 해당 클래스에서 선언 된 클래스로 확장됩니까?

CL 버전 16 (Visual Studio 2010)에서는 오류없이 컴파일되지만 gcc g ++ 버전 4.1.1에서는 "typedef int A :: T가이 컨텍스트 내에서 private 임"오류를 제공합니다.

함수가 typedef로 호출 할 때도 동일한 동작이 발생합니다 (차이점을 발견 한 방식입니다).

class A { 
    friend class B; 
    typedef int T; 
}; 

class B { 
    A::T t; // ok 
    typedef A::T U; // ok 
    class C { 
     U u; // ok 
     A::T v; // compile error on gcc 
    }; 
}; 

간략하게 검색했지만 올바른 검색어를 찾을 수 없었습니다. 나는이 표준을 아직 읽지 않았다. 주제에 대해 이전에 질문이 있거나 C++ FAQ에 언급되어 있습니까? 다음 중 어느 경우에도 표준에 따라 어떤 동작이 적용됩니까? 표준 문서에서

+0

http://stackoverflow.com/questions/3584385/friend-access-to-protected-nested-class를 참조하십시오. –

+0

이 코드는 잘 형성되어 있습니다. gcc 4.5.1 및 comau online에서 컴파일됩니다. –

+0

Prasoon : 허. 내 gcc가 오래되었지만 새로 설치해야하는 이유가 궁금합니다. 오 잘. 고맙습니다! –

답변

9

., $11.4.2

친구로 클래스 선언은 클래스 부여 우정에서 개인 및 보호 된 멤버의 이름이 은 기본 지정자들과 멤버에 액세스 할 수 있음을 의미 befriended 클래스의 선언.

표준 문서에서 예., 자체

class A { 
class B { }; 
friend class X; 
}; 
struct X : A::B { // OK: A::B accessible to friend 
    A::B mx; // OK: A::B accessible to member of friend 
    class Y { 
     A::B my; // OK: A::B accessible to nested member of friend 
    }; 
}; 

은 따라서 그것은 오류없이 작동합니다.

+0

고마워요! 저에게 권위있는 것처럼 보입니다. –

+0

또한 [this] (http://stackoverflow.com/questions/5975421/does-friending-a-class-extend-to-classes-declared-within-that-class/5975757#5975757) 답장을 참조하십시오. –

4

은 당으로 some defect in the original standard C++03

있는 것으로 보인다 C++ 03 [중고 CD1] 문구와 예는 클래스 (부여 우정)의 개인 회원이에 액세스 할 수 있다고하기 때문에 컴파일하지 않아야 코드 친구 클래스의 중첩 된 멤버.

C++ 11은 C++ 03에서와 동일한 예제를 제공합니다. 이 예제에 대한 유일한 변경 사항은 친구 클래스의 중첩 된 멤버 (클래스)가 우정을 부여하는 클래스의 개인 멤버에 액세스 할 수 있다는 것입니다.

친구로 클래스를 선언하면 친구 관계를 부여하는 클래스의 비공개 및 보호 된 멤버의 이름이 비 호환 클래스의 기본 지정자 및 멤버 선언에서 액세스 될 수 있습니다.

또한 ... issue #45 Prasoon이 문제 # 45를 언급

+0

아! 다시 감사합니다. –

0

에서 C++ 0X에서이 동작 변경을 찾습니다. 중첩 클래스의

회원은 바깥 쪽 클래스의 멤버에 특별한 액세스 할 수 없으며, 바깥 쪽 클래스에 우정이 부여 된 클래스 나 함수에 : 이전 동작은 (11.7 [class.access.nest] 조 제 1 항)이었다.

gcc 4.1은 C++ 03 규칙에 따라 정확하다고 명시되어 있습니다. gcc 4.5와 MSVC2010은 C++ 0x 규칙을 사용하고 있습니다.

관련 문제