![]() |
|
|
![]()
|
|
| Podliy_Asasa |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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) Ругается на код:
Подскажите пожалуйста, какие параметры компиляции проекта стоит поменять, чтобы избавиться от ошибок? |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
попробуй заменить NULL на 0. или вообще выкинуть эту строчку. iterator сам себя проинициализирует.
вообще такая инициализация неправильна: iterator is implementation defined, никаких гарантий приведения его/к нему целого типа нет. Добавлено через 2 минуты и 6 секунд ЗЫ: VS 2008 EE эту байду компилирует. Добавлено через 5 минут и 51 секунду видимо у тебя STLPort. просто выкинь строчку |
|||
|
||||
| Podliy_Asasa |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 14.4.2007 Репутация: нет Всего: нет |
Я понимаю, что в принципе такое приведение неправильно, но старый компилятор этого не считал раньше к сожалению. И если мы заменим NULL на 0 мы получаем такую же ошибку привидения типов. Убирать данную строчку не желательно, тк стоит задача обойти это дело параметрами компиляции, если это возможно. (Там несколько подобных ошибок, например на != тоже ругается)
Это сообщение отредактировал(а) Podliy_Asasa - 30.11.2009, 12:03 |
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 1 Всего: 101 |
переключите STL на мелкософтовский. но: какова семантика сией строчки? полагаю, никакая. видимо как раз что бы сравнивать с 0. что тоже, естественно, не работает. там вообще логика имхо дожна быть другая: если предполагается, что итератор должен быть живой, то проверяется сначало размер map, а затем итератор сравнивается с map::end() ЗЫ: и микрософтовский STL, и STLPort по умолчанию инициализируют итератор нулем. так что don't worry |
|||
|
||||
| Podliy_Asasa |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 14.4.2007 Репутация: нет Всего: нет |
Да, если честно я сам не так много представляю случаев для необходимости обнуления итератора, но к сожалению проект достаточно большой и писал не я его, поэтому и смотрю в сторону параметров компиляции.
Данную строчку m_iterator = NULL в принципе можно было бы заменить, на m_iterator =map<long, Item>::iterator(), но опять же повторюсь не желательно, наверняка есть решение. baldina, спасибо за советы (вдруг ещё будут идеи пишите) |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Не помогут тебе параметры компиляции, т.к. дело, скорее всего, в разных вариантах STL. Прсваивание итератору указателя - не является стандартным поведением, это вопрос реализации. Плохо, если твоя программа использует такие зависимые от реализации вещи. Причем, в случае с нулем, это пол-беды, т.к. запросто можно заменить, скажем на присвоение конца последовательности (или положиться на конструктор по-умолчанию) - семантика скорее всего та же. А вот если инициализация указателем используется для настройки указателя на реальный элемент, тогда придется переделывать.
-------------------- ... |
|||
|
||||
| Podliy_Asasa |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 14.4.2007 Репутация: нет Всего: нет |
Earnest, понял, спасибо
|
|||
|
||||
| GavriKos |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 8.8.2007 Где: Донецк, Украина Репутация: нет Всего: 1 |
Earnest - верно подмечено, не знаю как там с 2002 (что это за студия вообще), но при переходе с 2003 на 2005 многое в стл-е поменяли. Увы, не все заменимо (сейчас не вспомню - проблемма была год назад). По моему, поменяли работу с деком и вектором, в часности перегруженные операторы. От себя могу добавить только одно - как можно больше стараться отказаться от мфс-шных типов данных и прочего. Сразу будет больше плюсов ;-)
--------------------
Донецкая группа IT - присоединяемся |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
STL - не MFC-шный тип данных. Если пользоваться только стандартными возможностями, то все должно быть ок. Беда в том, что есть много особенностей реализации, которые иногда удобно использовать. Скажем, возвращает ли оператор erase итератор на след. элемент. Можно ли итератор списка инициализировать указателем на элемент. Является ли итератор вектора указателем или чем-то более сложным. И.т.д. Сложно избежать искушения использовать такую возможность (если есть надобность). И не нужно, наверное. Нужно просто отдавать себе отчет в том, что делаешь, и соблюдать уверенность. А если придется портировать... Ну что же, это тоже работа. А кто обещал, что будет легко? -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |