Título: Sobre carga de operador [Visual Studio 2010] Publicado por: Namida en 15 Diciembre 2010, 21:33 pm ¡Hola a todos! Tengo el siguiente problema. No se como sobrecargar un operador dentro de una plantilla. Lo he intentando de la siguiente forma y me tira error.
Código: template<TYPE>class A{ Gracias de antemano por su ayuda ;) Título: Re: Sobre carga de operador [Visual Studio 2010] Publicado por: Littlehorse en 15 Diciembre 2010, 23:12 pm Y cual es el error? igual viendo el código lo mas probable es que no se encuentre la definición de la sobrecarga pero preferiría que lo confirmes así partimos del error.
Podes probar dos cosas, una es esta: Código
para "obligar" al compilador a ubicar la implementación. La segunda, tal vez no la mejor pero si la mas sencilla, declarar y definir la sobrecarga en el mismo bloque: Código
Cualquier cosa ya sabes. Saludos. Título: Re: Sobre carga de operador [Visual Studio 2010] Publicado por: Namida en 16 Diciembre 2010, 00:26 am Muchas gracias por tu respuestas. Sí, el error es de definición. Implementando directamente la sobrecarga del operador dentro de la clase si me funciona (el segundo ejemplo que mencionas). He intentado separar la declaración de la sobrecarga de su implementación sin éxito.
De todas formas el error dado por el compilador es el siguiente: Citar 1>------ Operación Generar iniciada: proyecto: Librerias, configuración: Debug Win32 ------ 1> main.cpp 1>main.obj : error LNK2019: símbolo externo "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class matrix<int>)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$matrix@H@@@Z) sin resolver al que se hace referencia en la función _main 1>C:\Documents and Settings\mis documentos\visual studio 2010\Projects\ProyectoDePruebas\Debug\Librerias.exe : fatal error LNK1120: 1 externos sin resolver ========== Generar: 0 correctos, 1 incorrectos, 0 actualizados, 0 omitidos ========== Sin más, gracias por la ayuda ;) Título: Re: Sobre carga de operador [Visual Studio 2010] Publicado por: Littlehorse en 16 Diciembre 2010, 02:15 am Postea como has hecho el intento de separar la implementación y lo vemos. Si puedes postea una minima expresion compilable (no importa si tiene ese error) asi lo vemos mas en detalle. El primer ejemplo también tendría que funcionar, y si no funciona eso, con una forward declaration también debería funcionar.
Postea cuando puedas así lo vemos en detalle. Saludos Título: Re: Sobre carga de operador [Visual Studio 2010] Publicado por: Namida en 16 Diciembre 2010, 07:56 am Código: //Definición de la clase Ahí te dejo el código básico de lo que, en principio, estoy intentando ejecutar. A ver si le puedes encontrar el fallo por el que no va. Sin más, gracias por todo :D Título: Re: Sobre carga de operador [Visual Studio 2010] Publicado por: Littlehorse en 16 Diciembre 2010, 21:11 pm Bueno usualmente no me gusta extenderme demasiado en las explicaciones al menos que sea realmente necesario, y en este caso lo es. Viendo el código ya el problema ha quedado claro, espero que la explicación también. ;D
Cuando el compilador recorre la clase y la analiza, al encontrarse con la declaración friend de la sobrecarga del operador, en este punto: Código
el compilador no sabe que dichas funciones en si mismas son templates, entonces asume que la definición de dichas funciones son precisamente, no-template. Al utilizar los métodos propiamente dichos, el compilador genera una llamada a las versiones no-template de dichos métodos, lo cual seria así: Código
pero esos métodos nunca están definidos puesto que en realidad técnicamente no existen. Entonces en ese momento el linker te da el error de referencia indefinida. La forma de solucionarlo es basicamente aclarándole al compilador que la versión de la función que tiene que buscar es precisamente, un template. Primero que nada, usamos forward declarations de la clase y de la sobrecarga: Código
y luego de eso, agregamos <> a la sobrecarga del operador para que el compilador al recorrer la clase sepa que nos estamos refiriendo a un template: Código
y luego lo defines: Código
El código final te debería quedar así: Código
Eso o declarar y definir la sobrecarga dentro de la clase. No lo he probado porque tengo el compilador bastante ocupado, pero si no llega a funcionar correctamente, ya sabes. Saludos! Título: Re: Sobre carga de operador [Visual Studio 2010] Publicado por: Namida en 17 Diciembre 2010, 09:40 am Muchas gracias Littlehorse!! El problema me ha quedado bastante claro con tu explicación. Ya probé a realizarlo de dicha forma y va sin problemas, asi que.... ¡Problema resuelto! ;-)
|