Fehler C2678 nach C ++ Code von VC6 zu VS2008 Migration - kein Betreiber gefunden, der nimmt einen linken Operanden vom Typ ‚Typ‘

StackOverflow https://stackoverflow.com/questions/968602

Frage

Dieses Stück Code kompiliert Datei in VC6 aber in VS 2008 gibt es einen Fehler. Kann mir jemand sagen, warum? Ich denke, es liegt daran, dass Sie nicht mehr einen Zeiger auf NULL vergleichen (was ein typedef für 0 ist). Wenn das der Fall ist, wie kann ich tun, diesen Vergleich in VC9?

for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin(); iT < attrLst.end(); iT++)
        { 
            if ( (iT != NULL) && (*iT != NULL) ) //Error: C2678
            {
//code
}
}
  

Fehler C2678: binary '=': kein Betreiber   gefunden, die einen linken Operanden nimmt   vom Typ   'Std :: _ Vector_iterator <_Ty, _Alloc>'   (Oder gibt es keine akzeptable Umwandlung)

War es hilfreich?

Lösung

Der Typ für ‚std :: vector :: iterator‘ ist nicht unbedingt ein Zeigertyp, so dass Sie es nicht auf NULL vergleichen.

In Ihrem alten Compiler es passiert nur ein Zeiger zu sein und so Ihren Code kompiliert. Aber man einfach Glück bekommt (wie gezeigt, wenn Sie den Code in einem anderen Compiler verschoben).

Der einzige Test auf Iterator Sie haben, ist es zu vergleichen, um zu beenden () oder beginnen () oder jede gültige Iterator im Bereich beginnen () -> end (). Da dies ein Vektor ist, können Sie mit dem Iterator mathematische Operationen tun. iT-begin () sollten Sie eine Offset geben. Aber das gilt nicht für alle Container (überprüfen jede Container-Dokumentation).

Alles, was Sie tun müssen, ist Test, was der Iterator Punkte an:

for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin();
      iT != attrLst.end();  // Changed this. Notice the !=
      ++iT)                 // Changed this. Prefer pre increment for not integer types
{ 
    if ( *iT != NULL)
    {
         //code
    }
}

Andere Tipps

Der Iterator ist kein Zeiger, es ist eine Instanz der Klasse ist und nicht über den binären Operator! = Es mit null zu vergleichen.

Sie versuchen, den Iterator auf NULL in der ersten Bedingung in der if-Anweisung zu vergleichen. Sie brauchen nicht diesen ersten Vergleich als Iterator iT alays innerhalb des gültigen Teils der Liste sein soll.

einen Iterator auf NULL Vergleich war nie legal. VC6 lassen Sie es tun, aber es war falsch, so zu tun.

Im Beispiel Sie geben, ist der Vergleich sinnlos, da der Iterator immer auf etwas verweisen. Überprüfen (* IT)! = NULL ist sinnvoll und immer noch funktioniert.

Wenn es eine reale Aussicht, dass ein Iterator nicht auf ein gültiges Objekt zeigt, VC9 hat eine nicht dokumentierte Funktion

IT._Has_container()

das wird, wenn ein Iterator zeigt auf einen Behälter und falsch wahr sein, wenn der Iterator nicht. Um den Iterator auf nichts festgelegt, eine leere Iterator zuweisen:

IT = std::vector<aCattrBase*>::iterator();

Der oben repräsentiert nicht-portablen Code und ziemlich schlechten Stil, und ich empfehle nicht alles entwerfen, es zu benutzen. Wenn Sie jedoch benötigen, um schnell einige VC6 Code zu erhalten auf VC9 zu kompilieren, es könnte Ihnen aus der Patsche.

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