SoloCodigo

Programación General => C/C++ => Visual C++ => Mensaje iniciado por: diego.martinez en Viernes 2 de Marzo de 2007, 11:09

Título: Templates
Publicado por: diego.martinez en Viernes 2 de Marzo de 2007, 11:09
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?
Título: Re: Templates
Publicado por: Eternal Idol en Viernes 2 de Marzo de 2007, 11:22
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.
Título: Re: Templates
Publicado por: diego.martinez en Viernes 2 de Marzo de 2007, 11:48
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.
Título: Re: Templates
Publicado por: Eternal Idol en Viernes 2 de Marzo de 2007, 12:55
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/stdexport.asp)

http://www.codeproject.com/cpp/templatesourceorg.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 ...
Título: Re: Templates
Publicado por: diego.martinez en Viernes 2 de Marzo de 2007, 14:31
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:
Título: Re: Templates
Publicado por: Eternal Idol en Viernes 2 de Marzo de 2007, 14:33
De nadas  B)
Título: Re: Templates
Publicado por: SteelX en Viernes 2 de Marzo de 2007, 19:29
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>??
Título: Re: Templates
Publicado por: Eternal Idol en Viernes 2 de Marzo de 2007, 21:18
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).