desaparecido ; antes identificador al compilar código VC6 en VC9
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.
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.