Ошибка C2678 после переноса кода C ++ из VS2003 в VS2010, ошибка C2679: двоичный файл «=»: не найден оператор, который принимает правый операнд типа «int» - PullRequest
1 голос
/ 08 декабря 2011
std::vector<std::string>::iterator it;

it = NULL;
do
{
    if(it == NULL)
        it = init.begin();
    else
        ++it;
    if(it == init.end())
        return 1; 
}
while(it->empty());

Приведенный выше фрагмент кода прекрасно работает с VS2003, но при переносе на VS2010 выдает ошибку компиляции, говоря

error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(388): could be 'std::_Vector_iterator<_Myvec> &std::_Vector_iterator<_Myvec>::operator =(const std::_Vector_iterator<_Myvec> &)'
1>          with
1>          [
1>              _Myvec=std::_Vector_val<std::string,std::allocator<std::string>>
1>          ]
1>          while trying to match the argument list '(std::_Vector_iterator<_Myvec>, int)'
1>          with
1>          [
1>              _Myvec=std::_Vector_val<std::string,std::allocator<std::string>>
1>          ]
1>d:\vs2010_ws\acct ford 6.2.4 source code\acct_ford_ws\vector\src\driver\cancardxl.cpp(81): error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::_Vector_iterator<_Myvec>' (or there is no acceptable conversion)
1>          with
1>          [
1>              _Myvec=std::_Vector_val<std::string,std::allocator<std::string>>
1>          ]

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011

Вы предполагали, что векторный итератор может быть инициализирован и назначен из int (или некоторой формы указателя?).Это не так.

Вы можете преобразовать свой цикл в что-то вроде:

if (init.empty())
  return 1;

it = init.begin();
while (it->empty())
{
  ++it;
  if (it == init.end())
    return 1;
}
2 голосов
/ 08 декабря 2011

Это потому, что вы пытаетесь присвоить NULL итератору (это не указатель!) Компилятор ясно говорит, что это не поддерживается. Кстати, в чем причина такого назначения ??

Обычно, если вы хотите запустить коллекцию, вы должны написать что-то вроде:

for (VectorType::iterator it = init.begin(); it != init.end(); ++it)
{
     // do something with it here   
}
...