[C con Clase] Sobrecarga de operadores: problemas con ostream

Steven Davidson srd4121 en njit.edu
Mar Mar 10 16:17:26 CET 2009


Hola Vicente,

vicente lozano wrote:
> Hola,
> 
> haciendo un ejercicio de cadenas me encuentro con lo siguiente:
> 
> /// Cadena.h
> #include <iostream>
> #include <cstream>/
> ...
> *class */Cadena/ *{*
>  *private:*
> _*10-> *_ *char* */pstr/;
>  *public:*
>   ...
> *_25->_  friend* *ostream & **operator*<< *(ostream&, const Cadena&);*
>  ....
> *}*
> 
> ///Cadena.cpp
> _*5->*_ #include "Cadena.h"/
> *using namespace *std;
> ...
> *ostream & operator*<< *(ostream&* os*, const Cadena&* cad*)*
> *{*
> _*71->*_ os << cad.pstr;
>  *return* os*;*
> *}*
> ....
> 
> Y cuando intento compilar en dev-C++ 4.9.9.2 me da los errores:
> in file included from Cadena.cpp
> 25 ISO C++ forbids declaration od 'ostream' with no type
> 25 'ostream' is neither function nor member function; cannot be
> declared friend
> 25 expecter ; before & token
> In function 'std::ostream& operator<<(std::ostream&,constCadena&)
> 10char* Cadena::pstr is private
> 71 within this context
> 
> El tema es que si en lugar de acceso directo al elemento y friend lo 
> pongo sin ser friend y con un getter (esto lo he probado con enteros) 
> entonces funciona.
> Me gustaria comprender porque no me deja hacer esto, porque yo pienso 
> que me tendria que permitir hacerlo, no veo que puede estar mal.
> 

El mensaje del error se basa en que el compilador desconoce que 
'ostream' sea un tipo de dato, pensando que estamos declarando la 
variable 'ostream'. Esto es porque seguramente se te ha olvidado indicar 
el espacio con nombre 'std'. Puedes reescribir la línea #25 de esta manera:

friend std::ostream & operator<< ( std::ostream&, const Cadena& );

También puedes escribir la directiva de compilador 'using' después de 
incluir los ficheros de cabecera. Esto sería,

#include <iostream>

using namespace std;
...

En "Cadena.cpp", no existe el mismo error acerca de 'ostream', porque 
indicaste que vas a usar el espacio con nombre 'std'.

Los demás errores se basan en el primer problema y desaparecerán cuando 
agregues 'std' en "Cadena.h".


Espero que esto te ayude.

Steven





Más información sobre la lista de distribución Cconclase