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

vicente lozano vicentelozano en gmail.com
Mar Mar 10 16:26:30 CET 2009


Gracias tio, ya funciona. Ahora estoy mirando lo que me dijiste en el otro
post de los castings y los templates, bueno, que lo pondre alli por no hacer
mas offtopic.

Muchas gracias por tu ayuda.

2009/3/10 Steven Davidson <srd4121 en njit.edu>

> 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
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090310/d20fd560/attachment.html>


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