2011-08-23 29 views
10

Có vấn đề với phương pháp cụ thể này và không chắc chắn cách giải quyết nó! Các lỗi tôi nhận được là ở trên:Không thể truy cập thành viên riêng được khai báo trong lớp 'std :: basic_ios <_Elem, _Traits>'

"lỗi C2248: 'std :: basic_ios < _Elem, _Traits> :: basic_ios': không truy cập thành viên tư nhân có thể khai báo trong lớp 'std :: basic_ios < _Elem, _Traits>' C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ bao gồm ostream 604" \

phương pháp của tôi là:

ostream operator<<(ostream & stream, ProcessClass const & rhs) 
{ 
    stream << rhs.name_; 
    return stream; 
} 

Và trong tiêu đề:

friend std::ostream operator<<(std::ostream & stream, ProcessClass const & rhs); 

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này? Tôi nghĩ rằng đó là một cái gì đó để làm với đi qua tham chiếu thay vì giá trị ... nhưng tôi là một chút bối rối!

Trả lời

12

Loại trả về phải là ostream & là tham chiếu đến ostream.

ostream & operator<<(ostream & stream, ProcessClass const & rhs) 
{ //^^^ note this! 
    stream << rhs.name_; 
    return stream; 
} 

Khi bạn quay lại bởi giá trị (thay vì tham khảo), sau đó đòi hỏi phải sao chép các đối tượng dòng, nhưng sao chép bất kỳ đối tượng dòng trong C++ đã được tàn tật bởi đã làm bản sao -constructor private.

1. cũng như chuyển nhượng bản sao.

Để biết tại sao sao chép bất kỳ dòng đã bị vô hiệu, đọc câu trả lời của tôi chi tiết ở đây:

+0

Bây giờ điều khó hiểu là (và tôi không chắc chắn những gì tôi đang thiếu) là khi tôi c hange nó lên trên (mà tôi đã thử trước) sau đó tôi nhận được một lỗi ... 'lỗi C2556: 'std :: ostream & operator << (std :: ostream &, const ProcessClass &)': các chức năng quá tải khác chỉ bằng loại trả về từ 'std :: ostream operator << (std :: ostream &, const ProcessClass &)' ' NB. Tôi đã sửa đổi một chút mã, nhưng đi cùng với mã như trên, lỗi được tạo ra theo cách thức khi biên dịch. – Fids

+1

@Đặt giá: Bạn đã xác định hai lần trong lớp học của mình. Tại sao bạn định nghĩa nó hai lần? – Nawaz

4

Bạn không thể sao chép suối, thay vì trả về một tài liệu tham khảo, thay đổi để

ostream& operator<<(ostream & stream, ProcessClass const & rhs) 
Các vấn đề liên quan