Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Akumadie en 25 Noviembre 2016, 22:11 pm



Título: Ayuda con la plantilla y herencia
Publicado por: Akumadie en 25 Noviembre 2016, 22:11 pm
Hola a todos! Tengo un problema al usar una plantilla (template) para devolver un objeto.
el código que tengo es:

Código
  1.  
  2. template <typename P> P Datos::devolverPersona() {
  3. P nuevo = P(strPersona.Apellido, strPersona.Nombre, strPersona.DNI, strPersona.ID());
  4. return nuevo;
  5. }
  6.  
  7.  

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
  1. Cliente c1 = _d1->devolverPersona<Cliente>();
  2.  

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


Título: Re: Ayuda con la plantilla y herencia
Publicado por: avesudra en 26 Noviembre 2016, 01:03 am
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.


Título: Re: Ayuda con la plantilla y herencia
Publicado por: ivancea96 en 26 Noviembre 2016, 12:58 pm
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.


Título: Re: Ayuda con la plantilla y herencia
Publicado por: Akumadie en 28 Noviembre 2016, 13:23 pm
Muchas Gracias!!
Me fue de mucha ayuda !!!