중첩 클래스에 프랜드 함수를 정의 하려면???

exsider의 이미지

class A {
    private:
        class B {
            public:
                   //  멤버데이터와 함수 모두 public 
                   std::ostream & print(std::ostream &);
                   ...
        };
        friend
        std::ostream & operator<<(std::ostream & , const A::B &);

        ...

    public:
         ...
};

std::ostream & operator<<(std::ostream & os, const A::B & p)
{
       return p.print(os);
}

위의 코드처럼 A 클래스 안에 정의한 B 클래스를 출력하는 연산자를 만들려고
하는데요,

class A 에 프랜드 선언이 있는데도 접근할 수 없다며 에러가 납니다.(vc++6)

cannot access private class declared in class 'A' 그런데 g++에서는 잘 컴파일이 됩니다. 이게 vc++ 의 문제인가요???

컴파일 되게 하는 방법이 없는지???

체스맨의 이미지

#include <iostream>

class A { 
    private: 
        class B { 
            public:std::ostream & print(std::ostream&) const;  
        }; 
    public: 
        friend std::ostream & operator<<(std::ostream & os , const class A::B  &p);
}; 

std::ostream & operator<<(std::ostream & os, const class A::B & p) 
{ 
       return p.print(os); 
}

Orion Project : http://orionids.org

winner의 이미지

Accelerated C++ 번역서
338 쪽 맨 아래, 349 쪽 맨 위.

그렇다면 GCC 의 bug 로 봐야 할 것 같습니다.

만약 public 에 원형선언을 해서 가능하다면 GCC 를 배려해서 public 에 선언해야겠지만 말입니다.