2012-08-23 12 views
5

Ho una struct che assomiglia a questo:'std :: :: ios_base ios_base (const std :: ios_base &)' è errore privata', mentre il sovraccarico operatore << per std :: ostram

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

Devo sovraccaricare operator<< per std::ostream e person. Ho scritto questa funzione:

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

ma ricevo questo errore:

/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 |

risposta

16

std::ostream non è copiabile, e quando si restituisce in base al valore si sta costruendo la copia. Sebbene return value optimization indichi che la copia potrebbe non essere effettivamente eseguita, il compilatore richiede comunque che sia possibile copiare.

Il valore restituito canonico per questo operatore è di riferimento non-const:

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

Grazie per questo, mi ha aiutato :) +1 – T3CHN0CR4T

2

Hai dimenticato di riferimento nel tipo di ritorno:

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

ritorno per riferimento:

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

Altrimenti si sta tentando di copiare s e ostream s non sono copiabili (il messaggio di errore sta tentando di accedere a un costruttore di copie private).

Problemi correlati