2012-08-23 11 views
5

Mam struct, który wygląda tak:'std :: ios_base :: ios_base (const std :: ios_base &)' „jest prywatną błąd podczas przeładowania operator << dla std :: ostram

sturct person 
{ 
    string surname; 
    person(string n) : surname(n) {}; 
} 

Muszę przeciążyć operator<< dla std::ostream i person. Napisałem tę funkcję:

std::ostream operator<<(std::ostream & s, person & os) 
{ 
    s << os.surname; 
    return s; 
} 

ale otrzymuję ten błąd:

/usr/include/c++/4.6/bits/ios_base.h|788|error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private|

/usr/include/c++/4.6/bits/basic_ios.h|64|error: within this context

/usr/include/c++/4.6/ostream|57|note: synthesized method ‘std::basic_ios::basic_ios(const std::basic_ios&)’ first required here |

Odpowiedz

16

std::ostream nie jest konstrukcją kopiowalną, a po powrocie przez wartość tworzysz kopię. Chociaż return value optimization oznacza, że ​​kopia nie może być faktycznie wykonana, kompilator nadal wymaga, aby kopiowanie było możliwe.

Kanoniczna wartość zwracana przez tego operatora jest non-const odniesienia:

std::ostream& operator<<(std::ostream& o, const SomeType& t); 
+0

Dzięki za to, pomógł mi się :) +1 – T3CHN0CR4T

2

Zapomniałaś odniesienie w rodzaju powrotu:

std::ostream &operator<<(std::ostream & s, person & os) 
{ 
    return s << os.surname; 
} 
3

zwrotu przez odniesienie:

std::ostream& operator<<(...) 
      //^ 

W przeciwnym razie próbuje się skopiować s i ostream s nie można kopiować (komunikat o błędzie zawiera próbę uzyskania dostępu do konstruktora kopii private).

Powiązane problemy