Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Ошибка компиляции, параметры компиляции


Автор: Podliy_Asasa 30.11.2009, 10:47
Добрый день, столкнулся со следующей проблемой: 
Имеется проект написанный на Visual Studio 2002, существует необходимость скомпилировать его под 2008 студией, но в процессе возникают ошибки, отсутствующие в 2002.
Пример ошибки:
 error C2679: binary '=' : no operator found which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
Ругается на код:

Код

template <class Item>
class ItemList 
{

  ...
  private:
    ....
    map<long, Item> m_map;
    typename map<long, Item>::iterator m_iterator;
};

template <class Item>
ItemList<Item>::ItemList(BOOL flDeleteItems)
{
    .....
    m_iterator = NULL;              //Ошибка при компиляции (error C2679: binary '=' : no operator found which takes a right-hand operand 
                                                   //of type 'int' (or there is no acceptable conversion))
}


Подскажите пожалуйста, какие параметры компиляции проекта стоит поменять, чтобы избавиться от ошибок?

Автор: baldina 30.11.2009, 11:13
попробуй заменить NULL на 0. или вообще выкинуть эту строчку. iterator сам себя проинициализирует.
вообще такая инициализация неправильна: iterator is implementation defined, никаких гарантий приведения его/к нему целого типа нет.

Добавлено через 2 минуты и 6 секунд
ЗЫ: VS 2008 EE эту байду компилирует.

Добавлено через 5 минут и 51 секунду
видимо у тебя STLPort. просто выкинь строчку

Автор: Podliy_Asasa 30.11.2009, 11:22
Я понимаю, что в принципе такое приведение неправильно, но старый компилятор этого не считал раньше к сожалению. И если мы заменим NULL на 0 мы получаем такую же ошибку привидения типов. Убирать данную строчку не желательно, тк стоит задача обойти это дело параметрами компиляции, если это возможно. (Там несколько подобных ошибок, например на != тоже ругается)

Автор: baldina 30.11.2009, 11:36
Цитата

 задача обойти это дело параметрами компиляции

переключите STL на мелкософтовский.

но: какова семантика сией строчки? полагаю, никакая. видимо как раз что бы сравнивать с 0. что тоже, естественно, не работает.
там вообще логика имхо дожна быть другая: если предполагается, что итератор должен быть живой, то проверяется сначало размер map, а затем итератор сравнивается с map::end()

ЗЫ: и микрософтовский STL, и STLPort по умолчанию инициализируют итератор нулем. так что don't worry

Автор: Podliy_Asasa 30.11.2009, 11:49
Да, если честно я сам не так много представляю случаев для необходимости обнуления итератора, но к сожалению проект достаточно большой и писал не я его, поэтому и смотрю в сторону параметров компиляции.
Данную строчку m_iterator = NULL  в принципе можно было бы заменить, на m_iterator =map<long, Item>::iterator(), но опять же повторюсь не желательно, наверняка есть решение. 

baldina, спасибо за советы (вдруг ещё будут идеи пишите)

Автор: Earnest 1.12.2009, 20:32
Не помогут тебе параметры компиляции, т.к. дело, скорее всего, в разных вариантах STL. Прсваивание итератору указателя - не является стандартным поведением, это вопрос реализации. Плохо, если твоя программа использует такие зависимые от реализации вещи. Причем, в случае с нулем, это пол-беды, т.к. запросто можно заменить, скажем на присвоение конца последовательности (или положиться на конструктор по-умолчанию) - семантика скорее всего та же. А вот если инициализация указателем используется для настройки указателя на реальный элемент, тогда придется переделывать.  

Автор: Podliy_Asasa 2.12.2009, 08:15
Earnest, понял, спасибо

Автор: GavriKos 2.12.2009, 23:43
Earnest - верно подмечено, не знаю как там с 2002 (что это за студия вообще), но при переходе с 2003 на 2005 многое в стл-е поменяли. Увы, не все заменимо (сейчас не вспомню - проблемма была год назад). По моему, поменяли работу с деком и вектором, в часности перегруженные операторы. От себя могу добавить только одно - как можно больше стараться отказаться от мфс-шных типов данных и прочего. Сразу будет больше плюсов ;-)

Автор: Earnest 3.12.2009, 08:20
Цитата(GavriKos @  3.12.2009,  00:43 Найти цитируемый пост)
как можно больше стараться отказаться от мфс-шных типов данных 

STL - не MFC-шный тип данных. Если пользоваться только стандартными возможностями, то все должно быть ок. Беда в том, что есть много особенностей реализации, которые иногда удобно использовать. Скажем, возвращает ли оператор erase итератор на след. элемент. Можно ли итератор списка инициализировать указателем на элемент. Является ли итератор вектора указателем или чем-то более сложным. И.т.д. Сложно избежать искушения использовать такую возможность (если есть надобность). И не нужно, наверное. Нужно просто отдавать себе отчет в том, что делаешь, и соблюдать уверенность. А если придется портировать... Ну что же, это тоже работа.
А кто обещал, что будет легко? smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)