Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Iteradores dentro de Templates

Iniciado por ALRAZ, 14 de Febrero de 2008, 01:24:50 AM

« anterior - próximo »

ALRAZ

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 :)

Zaelsius

Necesitas cambiar

vector <T *>::iterator Pos;
por
typename vector <T *>::iterator Pos;

en ambas ocurrencias :)

ALRAZ

funciona  :D

Mil gracias ZaelSiuS :)






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.