Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка компиляции, параметры компиляции 
:(
    Опции темы
Podliy_Asasa
Дата 30.11.2009, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.4.2007

Репутация: нет
Всего: нет



Добрый день, столкнулся со следующей проблемой: 
Имеется проект написанный на 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))
}


Подскажите пожалуйста, какие параметры компиляции проекта стоит поменять, чтобы избавиться от ошибок?
PM MAIL   Вверх
baldina
Дата 30.11.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



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

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

Добавлено через 5 минут и 51 секунду
видимо у тебя STLPort. просто выкинь строчку
PM MAIL   Вверх
Podliy_Asasa
Дата 30.11.2009, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.4.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) Podliy_Asasa - 30.11.2009, 12:03
PM MAIL   Вверх
baldina
Дата 30.11.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата

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

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

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

ЗЫ: и микрософтовский STL, и STLPort по умолчанию инициализируют итератор нулем. так что don't worry
PM MAIL   Вверх
Podliy_Asasa
Дата 30.11.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.4.2007

Репутация: нет
Всего: нет



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

baldina, спасибо за советы (вдруг ещё будут идеи пишите)
PM MAIL   Вверх
Earnest
Дата 1.12.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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


--------------------
...
PM   Вверх
Podliy_Asasa
Дата 2.12.2009, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.4.2007

Репутация: нет
Всего: нет



Earnest, понял, спасибо
PM MAIL   Вверх
GavriKos
Дата 2.12.2009, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 8.8.2007
Где: Донецк, Украина

Репутация: нет
Всего: 1



Earnest - верно подмечено, не знаю как там с 2002 (что это за студия вообще), но при переходе с 2003 на 2005 многое в стл-е поменяли. Увы, не все заменимо (сейчас не вспомню - проблемма была год назад). По моему, поменяли работу с деком и вектором, в часности перегруженные операторы. От себя могу добавить только одно - как можно больше стараться отказаться от мфс-шных типов данных и прочего. Сразу будет больше плюсов ;-)
--------------------
Донецкая группа IT - присоединяемся
PM MAIL ICQ   Вверх
Earnest
Дата 3.12.2009, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



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

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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0576 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.