Frage

Der folgende Code kompiliert in VC6 in Ordnung, aber wenn ich das gleiche Projekt in VS2008 kompilieren gibt es die folgenden Fehler Fehler C2146: Syntaxfehler: fehlen; vor Bezeichner '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
}

Irgendwelche Ideen von dem, was hier falsch ist? Jemand mit Erfahrung C ++ Code aus VC6 zu VC2005 / 2008 möglicherweise in der Lage zu helfen.

bei der Migration
War es hilfreich?

Lösung

Sie müssen möglicherweise 'Typname' einfügen, der Compiler PRIMARY_MAP sagen :: iterator ist, in allen Fällen einen Typ.

z.

class  GCache
{
    private:

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

        typename PRIMARY_MAP::iterator m_pItr;

//Code truncated
}

Andere Tipps

Es sollte typename PRIMARY_MAP::iterator m_pItr; werden. Ansonsten Compiler denkt, dass PRIMARY_MAP :: iterator ein statisches Objekt ist und nicht in der Lage sein, es als eine Art zu erkennen. So haben Sie einen Hinweis an den Compiler zu geben, was anzeigt, dass es eine Art ist und kein statisches Objekt.

Sie können Opfer zu einer gemeinsamen Vorlage Problem zu fallen:

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

sollte:

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

Beachten Sie den Raum zwischen den llast zwei spitzen Klammern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top