[C con Clase] que no compila

dani ddagnino en gmail.com
Mar Jun 2 15:00:34 CEST 2009


Hola Carlos,
gracias por la ayuda. Te adjunto el error de compilación que me sale aunque no lo puse antes pq es enorme e incomprensibles para mi.

$ make
g++ -g -Wall -c main.cpp                                        
In file included from main.cpp:4:                               
complejos.h:5: error: la declaración de ‘operator<<’ como algo que no es función
complejos.h:5: error: expected ‘;’ before ‘(’ token                             
main.cpp: In function ‘int main()’:                                             
main.cpp:10: error: no match para ‘operator<<’ en ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)(& std::cout)), ((const char*)"z1 =  ")) << z1’                                                               
/usr/include/c++/4.3/ostream:112: nota: los candidatos son: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]                                                                                 
/usr/include/c++/4.3/ostream:121: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]                                                                                         
/usr/include/c++/4.3/ostream:131: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]                                   
/usr/include/c++/4.3/ostream:169: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]                                                             
/usr/include/c++/4.3/ostream:173: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]                                                    
/usr/include/c++/4.3/ostream:177: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]                                                                 
/usr/include/c++/4.3/bits/ostream.tcc:97: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]                                                    
/usr/include/c++/4.3/ostream:184: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]                                                   
/usr/include/c++/4.3/bits/ostream.tcc:111: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]                                                         
/usr/include/c++/4.3/ostream:195: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]                                                         
/usr/include/c++/4.3/ostream:204: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]                                                        
/usr/include/c++/4.3/ostream:208: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]                                               
/usr/include/c++/4.3/ostream:213: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]                                                               
/usr/include/c++/4.3/ostream:217: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]                                                                
/usr/include/c++/4.3/ostream:225: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]                                                          
/usr/include/c++/4.3/ostream:229: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]                                                          
/usr/include/c++/4.3/bits/ostream.tcc:125: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]                      
main.cpp:11: error: no match para ‘operator<<’ en ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)(& std::cout)), ((const char*)"z2 =  ")) << z2’                                                               
/usr/include/c++/4.3/ostream:112: nota: los candidatos son: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]                                                                                 
/usr/include/c++/4.3/ostream:121: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]                                                                                         
/usr/include/c++/4.3/ostream:131: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]                                   
/usr/include/c++/4.3/ostream:169: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]                                                             
/usr/include/c++/4.3/ostream:173: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]                                                    
/usr/include/c++/4.3/ostream:177: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]                                                                 
/usr/include/c++/4.3/bits/ostream.tcc:97: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]                                                    
/usr/include/c++/4.3/ostream:184: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]                                                   
/usr/include/c++/4.3/bits/ostream.tcc:111: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]                                                         
/usr/include/c++/4.3/ostream:195: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]                                                         
/usr/include/c++/4.3/ostream:204: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]                                                        
/usr/include/c++/4.3/ostream:208: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]                                               
/usr/include/c++/4.3/ostream:213: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]                                                               
/usr/include/c++/4.3/ostream:217: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]                                                                
/usr/include/c++/4.3/ostream:225: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]                                                          
/usr/include/c++/4.3/ostream:229: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]                                                          
/usr/include/c++/4.3/bits/ostream.tcc:125: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]                      
main.cpp:12: error: no match para ‘operator<<’ en ‘std::operator<< [with _Traits = std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)(& std::cout)), ((const char*)"z1+z2 =  ")) << z1.complejo::operator+(((const complejo&)((const complejo*)(& z2))))’                                                                                    
/usr/include/c++/4.3/ostream:112: nota: los candidatos son: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]                                                                                 
/usr/include/c++/4.3/ostream:121: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]                                                                                         
/usr/include/c++/4.3/ostream:131: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]                                   
/usr/include/c++/4.3/ostream:169: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:173: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:177: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits= std::char_traits<char>]
/usr/include/c++/4.3/bits/ostream.tcc:97: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:184: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT =char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/bits/ostream.tcc:111: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char,_Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:195: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char,_Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:204: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:208: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:213: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:217: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:225: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/ostream:229: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/include/c++/4.3/bits/ostream.tcc:125: nota:                     std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]
make: *** [main.o] Error 1

Saludos,
dani.




El pasado 2009-05-29 15:21:13, Carlos escribió:
 
C> Igualmente, te comento, que cuando realizas un cout, el operador DEBE ser publico. Si lo realizas desde el main, por ejemplo. Si no te dará errores de compilación por intentar saltarte la encapsulación. De todas formas, si quieres, puedo ayudarte a resolver esos errores de compilación, enviame lo que te sale.
C> Un saludo
C> > To: cconclase en listas.conclase.net
C> > From: ddagnino en gmail.com
C> > Date: Fri, 29 May 2009 12:26:48 +0200
C> > Subject: Re: [C con Clase] que no compila
C> > 
C> > Hola Carlos,
C> > ya había intentado esto, al final lo deje en privat pq en el curso CconClase había visto ejemplos así. Por ahora he quitado la sobrecarga del operador << y todo funciona. De todas formas gracias por la ayuda.
C> > Saludos,
C> > Dani.
C> > 
C> > El pasado 2009-05-29 08:23:05, Carlos escribió:
C> >  
C> > C> 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. 
C> > C> Yo cuando redefino el operador << lo que hago es esto:
C> > C> class complejo {
C> > C>         friend std::ostream& operator << (ostream& output, const complejo& z);
C> > C> 	public:
C> > C> 		complejo (double aa=0.0, double bb=0.0);
C> > C> 		complejo operator +(const complejo& z);
C> > C>  
C> > C> 	private:
C> > C> 		double a,b;
C> > C>  
C> > C> 	};
C> > C> De todas formas, casualmente, me coges con una clase TComplejo que he usado a lo largo de este año, en la universidad. 
C> > C> 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, 
C> > C> pero para que te hagas una idea de donde definir el operator <<:
C> > C> class TComplejo{
C> > C> 	friend bool operator<(const TComplejo&,const TComplejo&);
C> > C> 	friend bool operator>(const TComplejo&,const TComplejo&);
C> > C> 	friend TComplejo operator+(const double,const TComplejo&);
C> > C> 	friend TComplejo operator-(const double,const TComplejo&);
C> > C> 	friend TComplejo operator*(const double,const TComplejo&);
C> > C> 	friend ostream& operator<<(ostream &,const TComplejo &);
C> > C> 	private:
C> > C> 		double re;
C> > C> 		double im;
C> > C> 	public:
C> > C> 		TComplejo(double = 0,double = 0);
C> > C> 		TComplejo(const TComplejo&);
C> > C> 		~TComplejo();
C> > C> 		TComplejo& operator=(const TComplejo&);
C> > C> 		TComplejo operator+(const TComplejo&);
C> > C> 		TComplejo operator-(const TComplejo&);
C> > C> 		TComplejo operator*(const TComplejo&);
C> > C> 		TComplejo operator+(const double);
C> > C> 		TComplejo operator-(const double);
C> > C> 		TComplejo operator*(const double);
C> > C> 		bool operator==(const TComplejo&) const;
C> > C> 		bool operator!=(const TComplejo&);
C> > C> 		double Re() const;  //Devuelve parte real
C> > C> 		double Im() const;  //Devuelve parte imaginaria
C> > C> 		void Re(double); //Modifica parte real
C> > C> 		void Im(double); //Modifica parte imaginaria
C> > C> 		double Arg(void) const;
C> > C> 		double Mod(void) const; //Calcula el módulo
C> > C> 		
C> > C> };
C> > C> Esta clase, te adelanto, que es totalmente funcional. Un saludo y espero que te sirva algo de todo esto. ;)
C> > C> > To: cconclase en listas.conclase.net
C> > C> > From: ddagnino en gmail.com
C> > C> > Date: Wed, 27 May 2009 17:23:45 +0200
C> > C> > Subject: [C con Clase] que no compila
C> > C> > 
C> > C> > Hola gente,
C> > C> > 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.
C> > C> > 
C> > C> > El main.cpp es:
C> > C> > #include <cstdlib>
C> > C> > 
C> > C> > #include <iostream>
C> > C> > #include <cmath>
C> > C> > #include "complejos.h"
C> > C> > 
C> > C> > using namespace std;
C> > C> > 
C> > C> > 
C> > C> > 
C> > C> > int main(){
C> > C> > 
C> > C> > complejo z1(1.,2.),z2(3.,4.);
C> > C> > cout << "z1 =  " << z1 << endl;
C> > C> > cout << "z2 =  " << z2 << endl;
C> > C> > cout << "z1+z2 =  " << z1+z2 << endl;
C> > C> > 
C> > C> > getchar();
C> > C> >  return 0;
C> > C> > 
C> > C> > }
C> > C> > 
C> > C> > El complejos.h es:
C> > C> > #ifndef _COMPLEJOS_H_
C> > C> > 
C> > C> > #define _COMPLEJOS_H_
C> > C> > 
C> > C> > 
C> > C> > class complejo {
C> > C> > 	public:
C> > C> > 		complejo (double aa=0.0, double bb=0.0);
C> > C> > 		complejo operator +(const complejo& z);
C> > C> > 
C> > C> > 	private:
C> > C> > 		friend std::ostream& operator << (ostream& output, const complejo& z);
C> > C> > 
C> > C> > 		double a,b;
C> > C> > 
C> > C> > 	};
C> > C> > 
C> > C> > #endif
C> > C> > 
C> > C> > Y el complejos.cpp es:
C> > C> > #include <iostream>
C> > C> > #include <cmath>
C> > C> > #include "complejos.h"
C> > C> > using namespace std;
C> > C> > 
C> > C> > inline complejo::complejo (double aa, double bb): a(aa), b(bb) {}
C> > C> > 
C> > C> > inline std::ostream& operator << (ostream& output, const complejo& z){
C> > C> > 	output << z.a << " " << z.b;
C> > C> > 	return output;
C> > C> > 	}
C> > C> > 
C> > C> > 
C> > C> > inline complejo complejo::operator +(const complejo& z){
C> > C> > 
C> > C> >    complejo temp (a+z.a , b+z.b);
C> > C> > 
C> > C> >    return temp;
C> > C> > 
C> > C> >    }
C> > C> > 
C> > C> > El Makefile es (creo que no hace falta pero yo lo meto):
C> > C> > CXX = g++
C> > C> > CCFLAGS = -g -Wall
C> > C> > 
C> > C> > myproj: main.o complejos.o
C> > C> > 	$(CXX) $(CCFLAGS) -o myproj main.o complejos.o
C> > C> > 
C> > C> > complejos.o: complejos.cpp complejos.h
C> > C> > 	$(CXX) $(CCFLAGS) -c complejos.cpp
C> > C> > 
C> > C> > main.o: main.cpp complejos.h
C> > C> > 	$(CXX) $(CCFLAGS) -c main.cpp
C> > C> > 
C> > C> > 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.
C> > C> > Saludos y gracias de ante mano,
C> > C> > Dani.
C> > C> > _______________________________________________
C> > C> > Lista de correo Cconclase Cconclase en listas.conclase.net
C> > C> > http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
C> > C> > Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
C> > C> _________________________________________________________________
C> > C> ¡Acelera con la Fórmula 1! Juega y demuestra lo que sabes con MSN Deportes
C> > C> http://msn.es.predictorpro.com/grand-prix/overview.aspx?season=8 
C> > C> _______________________________________________
C> > C> Lista de correo Cconclase Cconclase en listas.conclase.net
C> > C> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
C> > C> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
C> > _______________________________________________
C> > Lista de correo Cconclase Cconclase en listas.conclase.net
C> > http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
C> > Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
C> _________________________________________________________________
C> ¡Quítate unos clics! Ahora, Internet Explorer 8 tiene todo lo que te gusta de Windows Live ¡Consíguelo gratis! 
C> http://ie8.msn.com/microsoft/internet-explorer-8/es-es/ie8.aspx
C> _______________________________________________
C> Lista de correo Cconclase Cconclase en listas.conclase.net
C> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
C> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ


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