2011-11-10 3 views
9

이 중첩 개인 클래스에 대해 연산자 < <을 어떻게 오버로드 할 수 있습니까?중첩 된 개인 클래스의 연산자 <<을 오버로딩 할 수 있습니까?

class outer { 
    private: 
    class nested { 
     friend ostream& operator<<(ostream& os, const nested& a); 
    }; 
    // ... 
}; 

외부 클래스 컴파일러의 외부를 시도하는 개인 정보 보호에 대한 불평 :

error: ‘class outer::nested’ is private 

답변

13

당신은뿐만 아니라 operator<<outer의 친구를 만들 수 있습니다. 또는 당신은 , nested 완전히 inline을 구현할 수 예 :

class Outer 
{ 
    class Inner 
    { 
     friend std::ostream& 
     operator<<(std::ostream& dest, Inner const& obj) 
     { 
      obj.print(dest); 
      return dest; 
     } 
     // ... 
     // don't forget to define print (which needn't be inline) 
    }; 
    // ... 
}; 
+0

과 일 e print 함수는'const' 멤버 함수 여야합니다. 그것이'std :: ostream & print (std :: ostream & out) const' 인 경우,'operator <<'는'return obj.print (dest);'한 줄일 수 있습니다. – Nawaz

+0

왜 std : ostream이 Inner의 친구가되어야합니까? – Mordachai

+1

그렇지 않으면'Inner'에서 정의 할 수 없으므로. ('Inner'에 정의되어 있지 않다면 'Inner'는 Private 멤버 인 'Inner'에 액세스 할 수 없다는 문제가 있습니다.) –

6

당신은 (HH, CPP) 두 개의 서로 다른 파일에서 같은 일을하려면 당신은 친구에게이 시간에 다음과 같은 기능이 있습니다

을 시 :

// file.hh 
class Outer 
{ 
    class Inner 
    { 
     friend std::ostream& operator<<(std::ostream& dest, Inner const& obj); 
     // ... 
    }; 

    friend std::ostream& operator<<(std::ostream& dest, Outer::Inner const& obj); 
    // ... 
}; 

CPP :

// file.cpp: 
#include "file.hh" 

std::ostream &operator<<(std::ostream& dest, Outer::Inner const& obj) 
{ 
    return dest; 
}