Ayuda con la plantilla y herencia

Iniciado por Akumadie, 25 Noviembre 2016, 22:11 PM

0 Miembros y 1 Visitante están viendo este tema.

Akumadie

Hola a todos! Tengo un problema al usar una plantilla (template) para devolver un objeto.
el código que tengo es:

Código (cpp) [Seleccionar]


template <typename P> P Datos::devolverPersona() {
P nuevo = P(strPersona.Apellido, strPersona.Nombre, strPersona.DNI, strPersona.ID());
return nuevo;
}



El typename P puede ser entre una clase "Cliente" o "Proveedor". ambas heredan de una clase llamada Persona.

al llamar a la funcion:
Código (cpp) [Seleccionar]

Cliente c1 = _d1->devolverPersona<Cliente>();


me tira un error.  larguisimo:

"Severity   Code   Description   Project   File   Line   Suppression State
Error   LNK2019   unresolved external symbol "public: class Cliente __thiscall Datos::devolverPersona<class Cliente>(void)" (??$devolverPersona@VCliente@@@Datos@@$$FQAE?AVCliente@@XZ) referenced in function "public: void __thiscall Venta::MostrarDatosDeOperacion(void)" (?MostrarDatosDeOperacion@Venta@@$$FQAEXXZ)   tp02   E:\Documentos\Diego\Programacion\c++\Sistema de Compra-Venta\tp02\tp02\Venta.obj   1"

Ayuda por favor!! Gracias

avesudra

Hola Akumadie, podría ser porque tienes colocar las implementaciones de los métodos que usen programación genérica en el mismo fichero que su declaración (.hpp) o instanciar explícitamente las plantillas que vayas a usar en el ".cpp" en el que estás definiendo dichos métodos.

Por desgracia el enlazador no es capaz de realizar el enlace correctamente. Para ello se intentó incorporar la palabra reservada export en C++11, pero no se ha podido implementar correctamente y ha quedado como reservada pero en desuso. http://en.cppreference.com/w/cpp/keyword/export .

Si quieres más información:

http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file/495056#495056

Un saludo.
Regístrate en

ivancea96

Pensad que cuando se compila un fichero objeto (de Datos.cpp, por ejemplo), se tieneque compilar la función. No puede compilar todas las combinaciones del template. Solo compila las que se están usando en ese momento.
Luego pues, el .cpp trata de utilizas un "typename P" que no ha sido compilado.
No lo puede compilar él porque no tiene el código.
La solución, como dice avesudra, compilar los templates cada vez que se necesiten poniéndolos en el header.

Akumadie

Muchas Gracias!!
Me fue de mucha ayuda !!!