Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Implementacion de Sobrecargas operadores friend en Templates

Estas en el tema de Implementacion de Sobrecargas operadores friend en Templates en el foro de C/C++ en Foros del Web. A ver si no me lio explicando. En resumen : lo que quiero es implementar una sobrecarga de un operador como friend en un template ...
  #1 (permalink)  
Antiguo 02/12/2007, 17:48
Avatar de Solenbum  
Fecha de Ingreso: noviembre-2007
Mensajes: 45
Antigüedad: 16 años, 5 meses
Puntos: 0
Pregunta Implementacion de Sobrecargas operadores friend en Templates

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.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:31.