Domanda

Il seguente codice compila bene in VC6, ma quando compilo lo stesso progetto in VS2008 dà il seguente errore errore C2146: errore di sintassi: manca ';' prima di identificatore '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
}

Tutte le idee su ciò che è sbagliato qui? Qualcuno con esperienza nella migrazione di codice C ++ da VC6 a VC2005 / 2008 potrebbe essere in grado di aiutare.

È stato utile?

Soluzione

Potrebbe essere necessario inserire 'typename', a dire il compilatore PRIMARY_MAP :: iterator è, in tutti i casi, un tipo.

per es.

class  GCache
{
    private:

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

        typename PRIMARY_MAP::iterator m_pItr;

//Code truncated
}

Altri suggerimenti

Si dovrebbe typename PRIMARY_MAP::iterator m_pItr;. In caso contrario, il compilatore pensa che PRIMARY_MAP :: iterator è un oggetto statico e non sarà in grado di riconoscerlo come un tipo. Quindi, si deve dare un suggerimento per il compilatore che indica che si tratta di un tipo e non un oggetto statico.

Si può essere vittima di un problema modello comune:

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

dovrebbe essere:

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

Si noti lo spazio tra i due llast parentesi angolari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top