Erreur C2678 après la migration du code C ++ de VC6 à VS2008 - aucun opérateur trouvé qui prend un opØrande gauche de type « type »

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

Question

Ce morceau de code est compilé fichier VC6 mais dans VS 2008, il donne une erreur. Quelqu'un peut-il me dire pourquoi? Je suppose que c'est parce que vous ne pouvez plus comparer un pointeur NULL (ce qui est un typedef pour 0). Si tel est le cas, comment dois-je faire cette comparaison VC9?

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

C2678 d'erreur: binaire '=!: Aucun opérateur   trouvé qui prend un opØrande gauche   de type   'Std :: _ Vector_iterator <_Ty, _Alloc>'   (Ou il n'y a pas de conversion acceptable)

Était-ce utile?

La solution

Le type pour 'std :: vector :: iterator' est pas nécessairement un type de pointeur de sorte que vous ne pouvez pas le comparer à NULL.

Dans votre ancien compilateur juste arrivé d'être un pointeur et donc votre code compilé. Mais vous avez juste la chance (comme indiqué lorsque vous avez déplacé le code à un autre compilateur).

Le seul test sur iterator vous est de le comparer à la fin () ou commencer () ou tout itérateur valide dans la plage begin () -> fin (). Puisque c'est un vecteur que vous pouvez faire des opérations mathématiques avec l'itérateur. iT-begin () devrait vous donner un décalage. Mais ce n'est pas valable pour tous les conteneurs (vérifier chaque documentation conteneurs).

Tout ce que vous devez faire est de tester ce que les points de iterator à:

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
    }
}

Autres conseils

Le iterator est pas un pointeur, il est une instance de classe et ne pas l'opérateur binaire! = Pour comparer avec null.

Vous essayez de comparer la iterator à NULL dans la première condition de l'instruction if. Vous n'avez pas besoin de cette première comparaison que l'itérateur doit iT alays être dans la partie valide de la liste.

En comparant un itérateur à NULL n'a jamais été légal. VC6 vous permettra de le faire, mais a eu tort de le faire.

Dans l'exemple que vous donnez, la comparaison n'a pas de sens, car le iterator pointera toujours à quelque chose. Vérification (* IT)! = NULL est raisonnable et fonctionne toujours.

S'il y a une réelle perspective qu'un iterator ne pointe pas vers un objet valide, VC9 a une fonction non documentée

IT._Has_container()

ce sera vrai si un point de iterator à un conteneur et faux si l'itérateur ne fonctionne pas. Pour définir l'itérateur à rien, vous attribuez un itérateur vide:

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

Le code ci-dessus représente non-portable et un style assez pauvre et je ne recommande pas concevoir quoi que ce soit à l'utiliser. Toutefois, si vous avez besoin d'obtenir rapidement un code VC6 pour compiler sur VC9, il pourrait vous sortir du pétrin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top