Pregunta

El siguiente código compila bien en VC6 pero cuando compilo el mismo proyecto en VS2008 se da el siguiente error error C2146: error de sintaxis: falta ';' antes de identificador 'm_pItr'

template <class pKey, class Data, class pCompare, 
          class hKey = int, class hCompare = less<hKey>,
          class sKey = int, class sCompare = less<sKey>,
          class tKey = int, class tCompare = less<tKey>,
          class cKey = int, class cCompare = less<cKey>>

class  GCache
{
    private:

        typedef map<pKey, Data, pCompare> PRIMARY_MAP;
        PRIMARY_MAP pMap;

        PRIMARY_MAP::iterator m_pItr; //error here

//Code truncated
}

¿Alguna idea de lo que está mal aquí? Alguien con experiencia en la migración de código C ++ de VC6 a VC2005 / 2008 podría ser capaz de ayudar.

¿Fue útil?

Solución

Es posible que tenga que insertar 'nombretipo', para indicar al compilador PRIMARY_MAP :: iterador es, en todos los casos, un tipo.

por ejemplo.

class  GCache
{
    private:

        typedef map<pKey, Data, pCompare> PRIMARY_MAP;
        PRIMARY_MAP pMap;

        typename PRIMARY_MAP::iterator m_pItr;

//Code truncated
}

Otros consejos

Debe typename PRIMARY_MAP::iterator m_pItr;. De lo contrario el compilador piensa que PRIMARY_MAP :: iterador es un objeto estático y no será capaz de reconocerlo como un tipo. Así que hay que dar una sugerencia para el compilador que indica que es un tipo y no un objeto estático.

Se le puede ser víctima de un problema plantilla común:

class cKey = int, class cCompare = less<cKey>>

debería ser:

class cKey = int, class cCompare = less<cKey> >

Tenga en cuenta el espacio entre los dos soportes de ángulo llast.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top