Erro C2678 Após migrar o código C ++ de VC6 para VS2008 - Nenhum operador encontrado que leva um operando esquerdo do tipo 'Tipo'
-
13-09-2019 - |
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)
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.