ausência de ; antes de identificador ao compilar código VC6 em VC9
Pergunta
O código a seguir compila bem em VC6 mas quando eu compilar o mesmo projeto no VS2008 dá o seguinte erro erro C2146: erro de sintaxe: em falta '; antes 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
}
Todas as ideias sobre o que está errado aqui? Alguém com experiência em migração de código C ++ a partir VC6 para VC2005 / 2008 pode ser capaz de ajuda.
Solução
Você pode precisar inserir 'typename', para dizer a PRIMARY_MAP compilador :: iterator é, em todos os casos, um tipo.
por exemplo.
class GCache
{
private:
typedef map<pKey, Data, pCompare> PRIMARY_MAP;
PRIMARY_MAP pMap;
typename PRIMARY_MAP::iterator m_pItr;
//Code truncated
}
Outras dicas
Deve ser typename PRIMARY_MAP::iterator m_pItr;
. Caso contrário compilador acha que PRIMARY_MAP :: iterator é um objeto estático e não será capaz de reconhecê-lo como um tipo. Então você tem que dar uma dica para o compilador indicando que é um tipo e não um objeto estático.
Você pode ser vítima de um problema modelo comum:
class cKey = int, class cCompare = less<cKey>>
deve ser:
class cKey = int, class cCompare = less<cKey> >
Observe o espaço entre as Llast dois colchetes.