<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
font-size: 10pt;
font-family:Verdana
}
</style>
</head>
<body class='hmmessage'>
Mmm...no se si me equivoco, pero...el operator << debe ser friend, como lo tienes puesto, pero nada de ponerlo en private, y tampoco en public. <br>Yo cuando redefino el operador << lo que hago es esto:<br><br><pre>class complejo {<br>        friend std::ostream& operator << (ostream& output, const complejo& z);<br><br>       public:<br>               complejo (double aa=0.0, double bb=0.0);<br>              complejo operator +(const complejo& z);<br> <br>        private:<br>              double a,b;<br> <br>        };<br><br>De todas formas, casualmente, me coges con una clase TComplejo que he usado a lo largo de este año, en la universidad. <br>La declaración de la misma es la que sigue, ten en cuenta que tengo unos cuantos métodos más que no te sirven, <br>pero para que te hagas una idea de donde definir el operator <<:<br><br>class TComplejo{<br>    friend bool operator<(const TComplejo&,const TComplejo&);<br>  friend bool operator>(const TComplejo&,const TComplejo&);<br>  friend TComplejo operator+(const double,const TComplejo&);<br>        friend TComplejo operator-(const double,const TComplejo&);<br>        friend TComplejo operator*(const double,const TComplejo&);<br>        friend ostream& operator<<(ostream &,const TComplejo &);<br>    private:<br>              double re;<br>            double im;<br>    public:<br>               TComplejo(double = 0,double = 0);<br>             TComplejo(const TComplejo&);<br>              ~TComplejo();<br>         TComplejo& operator=(const TComplejo&);<br>               TComplejo operator+(const TComplejo&);<br>            TComplejo operator-(const TComplejo&);<br>            TComplejo operator*(const TComplejo&);<br>            TComplejo operator+(const double);<br>            TComplejo operator-(const double);<br>            TComplejo operator*(const double);<br>            bool operator==(const TComplejo&) const;<br>          bool operator!=(const TComplejo&);<br>                double Re() const;  //Devuelve parte real<br>             double Im() const;  //Devuelve parte imaginaria<br>               void Re(double); //Modifica parte real<br>                void Im(double); //Modifica parte imaginaria<br>          double Arg(void) const;<br>               double Mod(void) const; //Calcula el módulo<br>           <br>};<br><br>Esta clase, te adelanto, que es totalmente funcional. Un saludo y espero que te sirva algo de todo esto. ;)<br></pre><br><br>> To: cconclase@listas.conclase.net<br>> From: ddagnino@gmail.com<br>> Date: Wed, 27 May 2009 17:23:45 +0200<br>> Subject: [C con Clase] que no compila<br>> <br>> Hola gente,<br>> estoy empezando a programar con clases y me he roto la cabeza buscando errores en el siguiente programa, haber si me podéis echar un cable.<br>> <br>> El main.cpp es:<br>> #include <cstdlib><br>> <br>> #include <iostream><br>> #include <cmath><br>> #include "complejos.h"<br>> <br>> using namespace std;<br>> <br>> <br>> <br>> int main(){<br>> <br>> complejo z1(1.,2.),z2(3.,4.);<br>> cout << "z1 =  " << z1 << endl;<br>> cout << "z2 =  " << z2 << endl;<br>> cout << "z1+z2 =  " << z1+z2 << endl;<br>> <br>> getchar();<br>>  return 0;<br>> <br>> }<br>> <br>> El complejos.h es:<br>> #ifndef _COMPLEJOS_H_<br>> <br>> #define _COMPLEJOS_H_<br>> <br>> <br>> class complejo {<br>>  public:<br>>           complejo (double aa=0.0, double bb=0.0);<br>>          complejo operator +(const complejo& z);<br>> <br>>        private:<br>>          friend std::ostream& operator << (ostream& output, const complejo& z);<br>> <br>>           double a,b;<br>> <br>>        };<br>> <br>> #endif<br>> <br>> Y el complejos.cpp es:<br>> #include <iostream><br>> #include <cmath><br>> #include "complejos.h"<br>> using namespace std;<br>> <br>> inline complejo::complejo (double aa, double bb): a(aa), b(bb) {}<br>> <br>> inline std::ostream& operator << (ostream& output, const complejo& z){<br>>    output << z.a << " " << z.b;<br>>  return output;<br>>    }<br>> <br>> <br>> inline complejo complejo::operator +(const complejo& z){<br>> <br>>    complejo temp (a+z.a , b+z.b);<br>> <br>>    return temp;<br>> <br>>    }<br>> <br>> El Makefile es (creo que no hace falta pero yo lo meto):<br>> CXX = g++<br>> CCFLAGS = -g -Wall<br>> <br>> myproj: main.o complejos.o<br>>   $(CXX) $(CCFLAGS) -o myproj main.o complejos.o<br>> <br>> complejos.o: complejos.cpp complejos.h<br>>        $(CXX) $(CCFLAGS) -c complejos.cpp<br>> <br>> main.o: main.cpp complejos.h<br>>      $(CXX) $(CCFLAGS) -c main.cpp<br>> <br>> El error al compilar es enorme así que no lo pongo, aun así lo que si me dice al principio es literalmente "la declaración de ‘operator<<’ como algo que no es función". He buscado en internet y he probado mil formas de escribir lo mismo pero siempre me peta al compila. Bueno, ya se que quizás estoy pidiendo mucho pero cualquier ayuda es bienvenida.<br>> Saludos y gracias de ante mano,<br>> Dani.<br>> _______________________________________________<br>> Lista de correo Cconclase Cconclase@listas.conclase.net<br>> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net<br>> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ<br><br /><hr />El nuevo Windows Live tiene mucho que ofrecerte.  <a href='http://www.windowslive.es ' target='_new'>Descúbrelo en estos vídeos </a></body>
</html>