2014-05-13 24 views
5

Làm thế nào để xác định bạn bè cho các lớp học riêng?bạn bè cho lớp riêng

#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; 
} 

lỗi:

:!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 

Nó hoạt động khi tôi xác định người bạn trực tiếp trong Priv_t

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

Làm thế nào để làm điều đó bên ngoài định nghĩa lớp/struct?

+1

Bài tiếp theo của mã mà không có số dòng, xin vui lòng! –

+0

@ DieterLàm xong. – name

Trả lời

3

Trong khi Priv_t là một tuyên bố cá nhân, bạn nên di chuyển

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

vào Base_t:

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

Tình trạng quá tải cho Priv_t sẽ phải là bạn của Base_t cũng như Priv_t.

1

Hữu nghị phải rõ ràng:

class Base_t 
{ 
//... 
private: 
    //... 
    // Add: 
    friend std::ostream & operator<<(std::ostream &os, 
               const Base_t::Priv_t& obj); 
}; 
Các vấn đề liên quan