Erro C2678 Após migrar o código C ++ de VC6 para VS2008 - Nenhum operador encontrado que leva um operando esquerdo do tipo 'Tipo'

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

Pergunta

Este pedaço de código compila o arquivo no VC6, mas no vs 2008, ele apresenta um erro. Alguém pode me dizer o porquê? Eu acho que é porque você não pode mais comparar um ponteiro com o NULL (que é um typedef para 0). Se for esse o caso, como faço essa comparação no VC9?

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

Erro C2678: Binário '! =': Nenhum operador encontrado que pega um operando esquerdo do tipo 'std :: _ Vector_iterator <_ty, _alloc>' (ou não há conversão aceitável)

Foi útil?

Solução

O tipo de 'std :: vector :: iterator' não é necessariamente um tipo de ponteiro, para que você não possa compará -lo com o NULL.

No seu antigo compilador, acabou de ser um ponteiro e, portanto, seu código compilou. Mas você acabou de ter sorte (como mostrado quando mudou o código para um compilador diferente).

O único teste no iterador que você tem é compará -lo para end () ou iniciar () ou qualquer iterador válido dentro do intervalo começar () -> end (). Como este é um vetor, você pode fazer operações matemáticas com o iterador. it-begin () deve fornecer um deslocamento. Mas isso não é válido para todos os contêineres (verifique cada documentação de cada contêineres).

Tudo que você precisa fazer é testar o que o iterador aponta para:

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

Outras dicas

O iterador não é um ponteiro, é uma instância de classe e não possui o operador binário! = Para compará -lo com o NULL.

Você está tentando comparar o iterador para anular na primeira condição na instrução IF. Você não precisa dessa primeira comparação como o iterador, ele deve estar dentro da parte válida da lista.

Comparar um iterador com NULL nunca foi legal. O VC6 deixou você fazer isso, mas estava errado em fazê -lo.

No exemplo que você dá, a comparação não tem sentido, pois o iterador sempre apontará para algo. Verificação (*it)! = Null é razoável e ainda funciona.

Se houver uma perspectiva real de que um iterador não aponte para um objeto válido, o VC9 tem uma função sem documentos

IT._Has_container()

Isso será verdade se um iterador apontar para um contêiner e falso se o iterador não o fizer. Para definir o iterador para nada, você atribui um iterador vazio:

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

O acima representa código não portável e estilo bastante ruim e eu não recomendo projetar nada para usá-lo. No entanto, se você precisar obter rapidamente algum código VC6 para compilar no VC9, ele pode tirar problemas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top