C2678 de error después de la migración de código C ++ de VC6 a VS2008 - encontró ningún operador que toma un operando de la izquierda del 'tipo' de tipo

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

Pregunta

Esta pieza de código se compila archivo en VC6 pero en VS 2008 se da un error. puede alguien decirme por que? Supongo que se debe a que ya no se puede comparar un puntero a NULL (que es un typedef para 0). Si ese es el caso, ¿cómo lo hago esta comparación en VC9?

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

C2678 de error: binario '=': ningún operador   encontrado que toma un operando de la izquierda   de tipo   'Std :: _ Vector_iterator <_Ty, _Alloc>'   (O no hay conversión aceptable)

¿Fue útil?

Solución

El tipo de 'std :: vector :: iterador' no es necesariamente un tipo de puntero por lo que no se puede comparar a NULL.

En el viejo compilador que acaba de pasar a ser un puntero y lo que el código compilado. Pero usted acaba de conseguir suerte (como se muestra cuando se trasladó el código a un compilador diferente).

La única prueba en iterador que tiene es compararlo con end () o begin () o cualquier iterador válida dentro del rango begin () -> end (). Dado que este es un vector que puede hacer operaciones matemáticas con el iterador. iT-begin () deben darle una compensación. Pero esto no es válido para todos los contenedores (marque cada documentación de contenedores).

Todo lo que necesita hacer es prueba de lo que los puntos de iterador en:

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

Otros consejos

El iterador no es un puntero, que es una instancia de clase y no tiene el operador binario! = Compararlo con nula.

Usted está tratando de comparar el iterador a NULL en la primera condición de la sentencia if. No es necesario esta primera comparación como el iterador Cabe diversión asegurada dentro de la parte válida de la lista.

La comparación de un iterador a NULL nunca fue legal. VC6 le permiten hacerlo, pero estaba equivocada para hacerlo.

En el ejemplo que das, la comparación no tiene sentido, ya que el iterador siempre apuntará a algo. Comprobación (* IT)! = NULL es razonable y todavía funciona.

Si hay una posibilidad real de que un iterador no apunta a un objeto válido, VC9 tiene una función indocumentado

IT._Has_container()

que será cierto si un iterador apunta a un contenedor y falso si el iterador no lo hace. Para establecer el iterador para nada, se asigna un iterador vacío:

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

Lo anterior representa el código no portable y bastante pobre estilo y no recomiendo el diseño de nada para usarlo. Sin embargo, si usted necesita para obtener rápidamente un código VC6 a compilar en VC9, podría conseguir que fuera de problemas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top