Logo

¡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.
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.