wenas :D
Tengo una duda sobre plantillas y los iteradores de STL.
Sucede que tengo una api donde tengo varios tipos distintos de clases, las cuales se entregan solo como punteros mediante llamadas a funciones "createobject", "createanim", "createetc" (Las clases están en una DLL y son derivadas de clases virtuales, que son las que ve el programador).
Estaba pensando en hacer un administrador de clases para llevar a cabo un registro de todo lo que se crea y hacer una respectiva labor de limpieza a la salida.
La primera idea que me vino a la mente es con un template como el que sigue:
template <class T> class ClassMan
{
private:
vector <T *>MyLst;
public:
ClassMan () {};
~ClassMan () {clear ();};
T *create ()
{
T *Tmp = new T;
if (Tmp != NULL)
MyLst.push_back (Tmp);
return Tmp;
};
void release (T *ClassPtr)
{
vector <T *>::iterator Pos;
Pos = find (MyLst.begin (), MyLst.end (), ClassPtr);
if (Pos != MyLst.end ())
{
delete (*Pos);
MyLst.erase (Pos);
}
};
void clear ()
{
vector <T *>::iterator Pos;
Pos = MyLst.begin ();
while (Pos != MyLst.end ())
{
(*Pos)->clear ();
delete (*Pos);
++Pos;
}
MyLst.clear ();
};
};
El problema es que, al momento de crear el iterador, el compilador me dice:
G:/yge/yg_sdk/include/YG/yg_classman.h: In member function `void ClassMan<T>::release(T*)':
G:/yge/yg_sdk/include/YG/yg_classman.h:62: error: expected `;' before "Pos"
G:/yge/yg_sdk/include/YG/yg_classman.h:64: error: `Pos' was not declared in this scope
ese "; before Pos" lo marca en la línea donde estoy tratando de crear el iterator. Imagino que esto se debe hacer de otra forma...
alguien sabe si se puede o una forma de darle la vuelta a esto?
Gracias de antemano :)
Necesitas cambiar
vector <T *>::iterator Pos;
por
typename vector <T *>::iterator Pos;
en ambas ocurrencias :)
funciona :D
Mil gracias ZaelSiuS :)