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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top