2012-08-23 22 views
5

Tengo una estructura que se parece a esto:'std :: :: ios_base ios_base (const std :: ios_base Y)' es el error privada', mientras que la sobrecarga del operador << para std :: Ostram

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

Necesito sobrecargar operator<< para std::ostream y person. Escribí esta función:

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

pero recibo este error:

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

Respuesta

16

std::ostream no se puede copiar, y cuando regresas por valor, estás copiando la construcción. Aunque return value optimization significa que la copia podría no estar hecha en realidad, el compilador aún requiere que sea posible copiar.

El valor de retorno canónica para este operador es por referencia no constante:

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

Gracias por eso, me ayudó :) 1 – T3CHN0CR4T

2

Se le olvidó referencia en el tipo de devolución:

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

retorno por referencia:

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

De lo contrario, se intenta copiar s y ostream s no son copiables (el mensaje de error indica un intento de acceder a un constructor de copia private).

Cuestiones relacionadas