Ошибка приведения типов в MSVS 2008

AlexandrD

for (AuraEffectList::const_iterator i.........
.............
if (i==((AuraEffectList::const_iterator)NULL))
в линуксе компилируется нормально в виндовсе выскакивает ошибка error C2440: приведение типов: невозможно преобразовать 'int' в 'std::list<_Ty>::_Const_iterator<_Secure_validation>'ну я так понимаю потому что NULL = 0 он и пишет про int как избавится?
4 ответа

AlexandrD

Как то так:
 char array [] = { 'x', 'l', 'x', 't', 's', 's' };
 
 list<char> str (array, array + 6);
 list<char>::iterator i;
 
 for (i = str.begin(); i != str.end(); i++)
 {
  if(*i == 0){ShowMessage("   ");}
 }
Поставь * перед i


AlexandrD

Ну такая проверка я так понял есть уже, вот полная проверка
if (i==((AuraEffectList::const_iterator)NULL)  || !(*i) || ((*i)->GetMiscValue() & schoolMask)==0))
    continue;
!(*i) - это наверное как раз одно и то же что и *i == 0 или я ошибаюсь? просто исключить первое условие проверки? или сделать так?
if ((*i==NULL)  || !(*i) || ((*i)->GetMiscValue() & schoolMask)==0))
    continue;


AlexandrD

Итератор - "вещь в себе", далеко не всегда это просто указатель. Поэтому его не всегда можно (и никогда не нужно) сравнивать с литералами, а только с такими же итераторами. Для перебора контейнера итераторы сравниваются с .end()


AlexandrD

В данном примере получим TRUE1 и TRUE3!!!
int *p;
 p = (int*)malloc(10*sizeof(int));//new int[10];
 *p = 0;
 if(*p==0)
 {
  ShowMessage("TRUE1");//Label1->Caption =  "true";//это истина
 }
 if(*p)
 {
  ShowMessage("TRUE2");//Label2->Caption =  "true";//это не сработает
 }
 if(!*p)
 {
  ShowMessage("TRUE3");//Label3->Caption =  "true";//это истина
 }
 free(p); //delete [] p;
В данном примере получим TRUE2
int *p;
 p = (int*)malloc(10*sizeof(int));//new int[10];
 //*p = 0;ВНИМАНИЕ СЮДА!!!
 if(*p==0)
 {
  ShowMessage("TRUE1");//Label1->Caption =  "true";//это не сработает
 }
 if(*p)
 {
  ShowMessage("TRUE2");//Label2->Caption =  "true";//это истина
 }
 if(!*p)
 {
  ShowMessage("TRUE3");//Label3->Caption =  "true";//это не сработает
 }
 free(p); //delete [] p;
То что я показал и то что сравнивается у тебя разные вещи!!!Господин Niсk Alte абсолютно прав!!!Хотя это сработает:
 char array [] = {0, 'l', 'x', 't', 's', 's' };
 
 list<char> str (array, array + 6);
 list<char>::iterator i;
 
 for (i = str.begin(); i != str.end(); i++)
 {
  if(*i == 0){ShowMessage("Чушь, но приятно");}//ЭТО СРАБОТАЕТ!!!
 }