• Sábado 14 de Diciembre de 2024, 13:44

Autor Tema:  Templates  (Leído 1652 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Templates
« en: Viernes 2 de Marzo de 2007, 11:09 »
0
buenas:

estoy haciendo una clase de arbol al estilo stl con plantillas.

el caso es que declaro la clase en el .H:

Código: Text
  1.  
  2. template <typename T>
  3. class appTreeNode
  4. {
  5.   ...
  6. }
  7.  
  8.  
y todo va bien,si los metodos los declararo en la propia clase;
 si no me da problemas de compilacion.

en el Cpp lo he puesto asi:

Código: Text
  1.  
  2. //------------------------------------------------------------------------------- AddSon
  3. template <typename T>
  4. void      appTreeNode<T>::AddSon      (T nSon)
  5. {
  6.   ...
  7. };
  8.  
  9.  

me dice que no encuentra el metodo a la hora de compilar:
unresolved external symbol "public: class appTreeNode<class AMESSAGE *> * __thiscall appTreeNode<class AMESSAGE *>::GetSon(int)" [...] referenced in function _WinMain@16

Tiene pinta de ser que uso el template incorrectamente, pero lo he hecho tal como he leido en las web...


Para usar las templates solo tengo que especificar el
template <typename T> antes del metodo que las usa no?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Templates
« Respuesta #1 en: Viernes 2 de Marzo de 2007, 11:22 »
0
Si redujeras el codigo a la minima expresion (un codigo "compilable" donde solo se produzca el error que te interesa) seguramente seria mas facil ayudarte.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Templates
« Respuesta #2 en: Viernes 2 de Marzo de 2007, 11:48 »
0
perdon, es que supuse que seria un problema de plantillas pongo el codigo:


Código: Text
  1.  
  2. ////main.cpp
  3.  
  4. #include &#60;windows.h&#62;
  5. #include &#34;appTreeNode.h&#34;
  6.  
  7. int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lp,int nShowCmd)
  8. {
  9. appTreeNode&#60;int&#62; *AlarmTree;   //creo el arbol de ints
  10. AlarmTree-&#62;AddSon(0);              //le añado un 0
  11.  
  12. return 0;
  13. }
  14.  
  15.  
  16. ////// appTreeNode.h
  17.  
  18. template &#60;class T&#62;
  19. class appTreeNode
  20. {
  21. protected:
  22.   T Data;
  23.  
  24.   appTreeNode&#60;T&#62; *Parent;
  25.   appTreeNode&#60;T&#62; *Son;
  26.   appTreeNode&#60;T&#62; *Brother;
  27.  
  28. public:
  29.  
  30. appTreeNode&#60;T&#62;(T TData) : Parent(NULL),
  31.                                           Son(NULL),
  32.                                           Brother(NULL)
  33.                                                    {this-&#62;Data=TData;}
  34. ~appTreeNode&#60;T&#62;  ();
  35.  
  36. void AddSon(T Son);
  37. };
  38.  
  39.  
  40. ///////// appTreeNode.cpp
  41. //------------------------------------------------------------------------------- Destructor
  42. template &#60;typename T&#62;
  43. appTreeNode&#60;T&#62;::~appTreeNode&#60;T&#62;        ()
  44. {
  45.  ///TO DO///
  46. };
  47. //------------------------------------------------------------------------------- AddSon
  48. template &#60;typename T&#62;
  49. void AddSon (T Son)
  50. {
  51.      appTreeNode&#60;T&#62; *Tmp;
  52.      if (this-&#62;Son==NULL)
  53.     {
  54.   this-&#62;Son=new appTreeNode&#60;T&#62;(Son);
  55.   this-&#62;Son-&#62;SetParent(this);
  56.     }
  57.   else
  58.     {
  59.     Tmp=this-&#62;Son;
  60.     while (Tmp-&#62;Brother!=NULL)
  61.                                Tmp=Tmp-&#62;Brother;
  62.     Tmp-&#62;Brother=new appTreeNode&#60;T&#62;(Son);
  63.     Tmp-&#62;SetParent(this);
  64.     }                          
  65.                          
  66. };
  67.  
  68.  

Aqui esta el codigo, es una prueba de arbol sencillita. Pero si no meto el AddSon en inline de la clase, me dice que no esta resuelta.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Templates
« Respuesta #3 en: Viernes 2 de Marzo de 2007, 12:55 »
0
El AppTreeNode.cpp no compila, esto tambien esta mal:
Código: Text
  1.  
  2. appTreeNode&#60;int&#62; *AlarmTree;   //creo el arbol de ints
  3. AlarmTree-&#62;AddSon(0);              //le añado un 0
  4.  
  5.  

main.cpp(9) : warning C4700: local variable 'AlarmTree' used without having been initialized

Ese warning se produce por una razon: estas declarando un puntero sin inicializarlo y despues lo usas, AlarmTree tiene un valor indefinido.

Tambien fijate la declaracion de AddSon (hace que sea parte de la plantilla).

El verdadero problema que es de enlazado es bastante complejo:
http://www.codeproject.com/cpp/stdexport.asp

http://www.codeproject.com/cpp/templatesourceorg.asp

Ya que export no es soportado por casi nadie yo te sugiero usar la solucion mas "simple":

Código: Text
  1.  
  2. #include &#34;appTreeNode.cpp&#34;
  3. template class appTreeNode &#60;int&#62;;
  4.  
  5.  
       

En templates.cpp o directamente seguir usando solo los .H ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: Templates
« Respuesta #4 en: Viernes 2 de Marzo de 2007, 14:31 »
0
muchas gracias por la respuesta.

Lo de no inicializar el objeto ha sido fallo mio al copy/pastear el codigo , estaba inicializado.

Voy a echarle un ojo a esos links a ver si me aclaro.

Gracias  :hola:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Templates
« Respuesta #5 en: Viernes 2 de Marzo de 2007, 14:33 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Templates
« Respuesta #6 en: Viernes 2 de Marzo de 2007, 19:29 »
0
Tuve problemas como el tuyo al utilizar templates.

Aunque por organizacion siempre se hacen declaraciones en el .h y deficiniones en el .cpp, los templates es mejor definirnos en el .h y hacer su declaracion en el mismo .h o por el contrario deberas utilizar export con las funciones para definir el template.

ah una cosa si usas <class T>  redefines con <typename T>??
Inside the code

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Templates
« Respuesta #7 en: Viernes 2 de Marzo de 2007, 21:18 »
0
Cita de: "SteelX"
Tuve problemas como el tuyo al utilizar templates.

Aunque por organizacion siempre se hacen declaraciones en el .h y deficiniones en el .cpp, los templates es mejor definirnos en el .h y hacer su declaracion en el mismo .h o por el contrario deberas utilizar export con las funciones para definir el template.
No es raro que hayas tenido esos problemas; las dos opciones fueron dadas pero el export que yo sepa SOLO funciona con un compilador (con VC++ SEGURO que no funciona).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.