UTNianos

Versión completa: [Solucionado]Consulta sobre el uso de template
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Antes que nada, estuve buscando sobre el uso de templates en internet y sobre todo en que radica mi problema pero hasta ahora no encontre nada muy satisfactorio. Para no perder mas tiempo dejo la consulta en el foro a ver si alguno sabe en que me puedo estar equivocando.

Les dejo las partes pertinentes del codigo, cualquier cosa el resto lo edito. Aclaro: La clase esta reducida, no tiene los constructores ni otras funciones que uso. Si la llegasen a necesitar, edito.

El problema lo tengo con el siguiente ejercicio:

Modificar el punto anterior para permitir la suma (+), resta (-) y asignación Feer de objetos tipo Punto.
Nota: tener en cuenta que las operaciones de deben controlar que los valores de x e y, no desborden el rango de +/- 1000.
No utilizar friend, para realizar la sobrecarga de los operadores suma (+) y resta (-).

Como preguntas / restriccion:

¿Requiere sobrecargar el operador de asignación Feer? ¿Por qué?

Justifique la ejecución de la línea q=r+47; (como se produce la suma entre el objeto Punto y el objeto int, suponiendo que mantuvo la consigna de escribir lo menos posible y no sobrecargó la suma de Punto con int)

Con respecto al codigo:



class Punto
{
private:
double mx;
double my;

public:
template <class T> Punto operator +(const T &);
};


Con respecto a la sobrecarga del operador +:



template <class T> Punto Punto::operator +(const T &op)
{
Punto C;

if(sizeof(T) == sizeof(Punto))
{
C.setPunto(mx + op.mx, my + op.my);
}
else
{
C.setPunto(mx + op, my);
}

return C;
}


Ahora en el main cuando algo como:

A = B + C; (siendo A, B y C objetos Punto). Obtengo el siguiente error:

Cita:main.cpp:18: error: undefined reference to `Punto Punto::operator+<Punto>(Punto const&)'

Mi idea es sobrecargar el operador + para poder sumar tanto mis objetos Punto como otros tipos (no me refiero a otros objetos).
De lo que estuve leyendo sobre templates evito inicializar con un tipo de variable a la funcion miembro operador + despues de haber instanciado uno o mas objetos punto.
O sea no hago:

A = B +<Punto>C;

Si necesitan mas aclaraciones, el codigo completo o algo en particular; edito el post. De momento sigo buscando las maneras de arreglar mi error o de usar debidamente el template.
Por si les interesa el uso de template lo estuve leyendo en:
Template para dummies

Una de las paginas mas completas en el uso del template que encontre en estos dias de busqueda.
Espacio en blanco innecesario.
Actualizacion:
Solucione el problema por asi decirlo, en resumidas cuentas es un problema exclusivo del linker. Una solucion rapida seria mover la implemetancion de la funcion en la firma dentro de la clase.
No me voy a explayar mucho en porque ocurre esto pero concretamente la implemetacion del template que se encuentra en el header tiene que ser visible dentro del cpp donde estan los desarrollos. El compilador se desliga el problema y para cuando el linker actua no hay tiempo para solucionarlo; esto ocurre aun agregando el .h dentro del .cpp.
Hay varias formas de solucionar esto pero les dejo estas paginas para que lean sobre el uso debido de templates (aparte de la pagina de arriba):

http://www.codeproject.com/Articles/3515...ource-Code
http://www.codeproject.com/Articles/4857...le-and-imp

Comentario aparte: no se recomienda el uso del modificador export ya que no esta soportado por el grueso de los compiladores y su implementacion en los que si esta suele ser compleja.

Se puede cerrar el thread.
URLs de referencia