manca; prima identificativo durante la compilazione del codice VC6 in VC9
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.
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.