Errore C2678 dopo la migrazione di codice C++ da VC6 per VS2008 - nessun operatore che prende un operando di sinistra di tipo "tipo"

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

Domanda

Questo pezzo di codice viene compilato in un file in VC6, ma in VS 2008 dà un errore.Qualcuno può dirmi perché?Credo che sia perché non è più possibile confrontare un puntatore a NULL (che è un typedef per 0).Se questo è il caso, come faccio a fare questo confronto in VC9?

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

errore C2678:binario '!=' :nessun operatore trovato, che prende un operando di sinistra di tipo 'std::_Vector_iterator<_Ty,_Alloc>' (o non c'è accettabile conversione)

È stato utile?

Soluzione

Il tipo per 'std :: vector :: iterator' non è necessariamente un tipo di puntatore quindi non si può paragonare a NULL.

Nel vostro vecchio compilatore che è capitato di essere un puntatore e così il codice compilato. Ma hai appena avuto la fortuna (come mostrato quando è stato spostato il codice per un compilatore diverso).

L'unico test sui iteratore che hai è per confrontarlo con end () o iniziare () o qualsiasi iteratore valido all'interno della gamma begin () -> end (). Poiché si tratta di un vettore si può fare operazioni matematiche con l'iteratore. iT-begin () dovrebbe darvi un offset. Ma questo non vale per tutti i contenitori (controllare ogni documentazione contenitori).

Tutto quello che dovete fare è testare quali sono i punti iteratore a:

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

Altri suggerimenti

L'iteratore non è un puntatore, è un'istanza di classe e non ha l'operatore binario! = Per confrontare con nulla.

Si sta cercando di confrontare l'iteratore NULL nella prima condizione nella if. Non hai bisogno di questo primo confronto come iteratore Dovrebbe alays situarsi nella parte valida della lista.

Confrontando un iteratore NULL è mai stato legale.VC6 consentono di farlo, ma è stato sbagliato per farlo.

Nell'esempio che dai, il paragone è senza senso, come l'iteratore sempre punto a qualcosa.Di controllo (*IT)!=NULL è ragionevole e funziona ancora.

Se c'è una reale prospettiva che un iteratore non fa riferimento a un oggetto valido, VC9 ha una funzione non documentata

IT._Has_container()

che sarà vero se un iteratore che punta a un contenitore e false se l'iteratore non.Per impostare l'iteratore per nulla, è possibile assegnare un vuoto iteratore:

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

Quanto sopra costituisce non un codice portatile e abbastanza poveri di stile e raccomando di non progettare nulla di usarlo.Tuttavia, se è necessario per ottenere rapidamente alcuni VC6 il codice da compilare su VC9, si potrebbe ottenere fuori dai guai.

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