Programación General > Visual C++

 Templates

(1/2) > >>

diego.martinez:
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 --- template <typename T> class appTreeNode{  ...}  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 --- //------------------------------------------------------------------------------- AddSontemplate <typename T>void      appTreeNode<T>::AddSon      (T nSon){  ...};  
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:
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.

diego.martinez:
perdon, es que supuse que seria un problema de plantillas pongo el codigo:



--- Código: Text --- ////main.cpp #include &#60;windows.h&#62;#include &#34;appTreeNode.h&#34; int APIENTRY WinMain(HINSTANCE hInst,HINSTANCE hPrev,LPSTR lp,int nShowCmd){appTreeNode&#60;int&#62; *AlarmTree;   //creo el arbol de intsAlarmTree-&#62;AddSon(0);              //le añado un 0 return 0;}  ////// appTreeNode.h template &#60;class T&#62; class appTreeNode{protected:  T Data;   appTreeNode&#60;T&#62; *Parent;  appTreeNode&#60;T&#62; *Son;  appTreeNode&#60;T&#62; *Brother;  public: appTreeNode&#60;T&#62;(T TData) : Parent(NULL),                                          Son(NULL),                                          Brother(NULL)                                                    {this-&#62;Data=TData;}~appTreeNode&#60;T&#62;  (); void AddSon(T Son);};  ///////// appTreeNode.cpp//------------------------------------------------------------------------------- Destructortemplate &#60;typename T&#62;appTreeNode&#60;T&#62;::~appTreeNode&#60;T&#62;        (){ ///TO DO/// };//------------------------------------------------------------------------------- AddSontemplate &#60;typename T&#62;void AddSon (T Son){     appTreeNode&#60;T&#62; *Tmp;     if (this-&#62;Son==NULL)     {  this-&#62;Son=new appTreeNode&#60;T&#62;(Son);  this-&#62;Son-&#62;SetParent(this);    }  else    {    Tmp=this-&#62;Son;    while (Tmp-&#62;Brother!=NULL)                               Tmp=Tmp-&#62;Brother;    Tmp-&#62;Brother=new appTreeNode&#60;T&#62;(Son);    Tmp-&#62;SetParent(this);    }                                                    };  
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:
El AppTreeNode.cpp no compila, esto tambien esta mal:

--- Código: Text --- appTreeNode&#60;int&#62; *AlarmTree;   //creo el arbol de intsAlarmTree-&#62;AddSon(0);              //le añado un 0  
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 --- #include &#34;appTreeNode.cpp&#34;template class appTreeNode &#60;int&#62;;          

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

diego.martinez:
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:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa