A ver si no me lio explicando.
En resumen:
lo que quiero es implementar una sobrecarga de un operador como friend en un template de forma a parte su implementacion, es decir, tener solo la cabecera en la declaración de la clase y la implementación por fuera de la clase. * He seguido las indicaciones de este mensaje (mismo problema que el mio):
http://listas.fi.uba.ar/pipermail/programacion/2005-April/001831.html
para poder implementar (por fuera) una sobrecarga de operador (<< salida en este caso) como friend en un template...
Y puse (tal como se dijo en el mensaje) el <tipo> despues del operador y antes de los parametros para que no diera avisos al compilar la libreria (en la declaracion, y no en la implementacion). (los avisos salen en el mensaje, no se si aporta, no lo pongo para no liar el post)
Código:
template <class algo>
class Lista {
private:
....
public:
....
friend ostream& operator<< <algo>(ostream& sout, Lista<algo>& lis);
};
....
template <class algo>
ostream& operator<< (ostream& os, Lista<algo>& lis) {
os << lis->DatosDelNodo << "cosas\n"; //realmente hago muchas otras cosas por eso quiero declararlo aparte.
return sout;
}
* Bien, compilo mi libreria y todo muy bonito y 0 problemas. El tema es cuando voy a usar dicha libreria en un ejemplo real, obtengo estos errores:
(Que conste que he buscado en internet información de templates, sobrecargas o algo en relación que tuviese y solo encontré aquel mensaje en referencia a mi pregunta)
lista.h: In instantiation of ‘Lista<TipoEjemplo>’:
ejemplo.cpp:135: instantiated from here
lista.h:78: error: el id de plantilla ‘operator<< <TipoEjemplo>’ para ‘std::basic_ostream<char, std::char_traits<char> >& operator<<(std::basic_ostream<char, std::char_traits<char> >&, Lista<TipoEjemplo>&)’ no coincide con ninguna declaración de plantilla
Haciendo uso de esta manera en el ejemplo.cpp
Lista<TipoEjemplo> te;
//hago cosas
cout << te;
Creo que ando muy equivocado. Agradecería respuestas ;)
* Originalmente lo tenía así (implementación dentro de la declaración), pero viendo que necesitaba hacer bastantes cosas decidí "separarlo".
Código:
template <class algo>
class Lista {
....
friend ostream& operator<< (ostream& sout, Lista<algo>& L) { //muchas cosas
return sout;}
};
//En ejemplo.cpp
Lista<TipoEjemplo> te;
//hago cosas
cout << te;
//0 problemas.