2014-05-13 3 views
5

개인 클래스의 친구를 정의하는 방법은 무엇입니까?개인 클래스의 친구

#include <iostream> 

class Base_t{ 
    private: 
     struct Priv_t{ 
      friend std::ostream & operator<<(std::ostream &os, const Priv_t& obj); 
     } p; 
    friend std::ostream & operator<<(std::ostream &os, const Base_t& obj); 
}; 

std::ostream & operator<<(std::ostream &os, const Base_t& obj) { 
    return os << "base: " << obj.p; 
} 

std::ostream & operator<<(std::ostream &os, const Base_t::Priv_t& obj) { 
    return os << "priv"; 
} 

int main() { 
    Base_t b; 
    std::cout << b << std::endl; 
} 

오류 :

:!make t17 |& tee /tmp/vB5G5ID/54 
g++  t17.cpp -o t17 
t17.cpp: In function 'std::ostream& operator<<(std::ostream&, const Base_t::Priv_t&)': 
t17.cpp:5:16: error: 'struct Base_t::Priv_t' is private 
     struct Priv_t{ 
       ^
t17.cpp:15:59: error: within this context 
std::ostream & operator<<(std::ostream &os, const Base_t::Priv_t& obj) { 
                 ^
make: *** [t17] Error 1 

shell returned 2 

내가 직접 Priv_t에서 친구를 정의 할 때 의미가 있습니다

friend std::ostream & operator<<(std::ostream &os, const Priv_t& obj) { return os << "priv"; } 

그 외부 클래스/구조체 정의를 수행하는 방법?

+1

행 번호가없는 코드의 다음 게시물을 작성하십시오. –

+0

@ DieterLücking done. – name

답변

3

, 당신은 Base_t

friend std::ostream & operator<<(std::ostream &os, const Base_t::Priv_t& obj); 

를 이동해야합니다 :

class Base_t 
{ 
private: 
    struct Priv_t 
    { 
    } p; 
    friend std::ostream & operator<<(std::ostream &os, const Base_t& obj); 
    friend std::ostream & operator<<(std::ostream &os, const Base_t::Priv_t& obj); 
}; 

Live code.

1

Priv_t에 대한 과부하는 Base_tPriv_t의 친구 여야합니다. Priv_t 개인 선언 동안

1

우정이 명시되어야합니다

class Base_t 
{ 
//... 
private: 
    //... 
    // Add: 
    friend std::ostream & operator<<(std::ostream &os, 
               const Base_t::Priv_t& obj); 
}; 
관련 문제