![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
код в шестой студии (пишу по памяти):
на последней строке седьмая студия (2003.NET) выкидывает ошибку, мол ну никак она не умеет преобразовывать такой iterator r void* Пришлось переписать все участки кода так, чтоб обменуть компилятор:
Но за токой код перед другими людьми стыдно! Я понимаю, что в следующей студии изменилась реализация библиотеки, но никак не могу сообразить: как же правильно преобразовать итератор к пустому указателю на этот байт памяти? |
||||
|
|||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
DENNN, ни очень хорошо так итератор использовать. Если хочешь получить ссылку на структуру, то надо использовать разыменовывание (как во втором коде). Ведь итератор это не всегда указатель, поэтому итератор и ввели. Для единообразия инспользования и vector, и list, и др. Если ты заменишь vector на list, то и 6-ая студия, я думаю, ошибку даст, потому что в list iterator - это класс.
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
То есть, ты считаешь что второй вариант - это нормально? И более изящное решение вряд ли возможно.
Просто в проекте работают несколько человек на различных средах и в планах сделать его кроссплатформенным, поэтому хочу для себя это вопрос уяснить окончательно (чтоб в будущем с исходниками таких проблем не возникало). |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
А что делать, если в классе итератора только оператор * перегружен для досупа к данным? По крайней мере это будет везде работать. Можно макрос написать, что изящней выглядело. |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
потом это макрос через несколько файлов протащить придеться, не я лучше тогда так оставлю (второй вариант)
Но все равно спасибо. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Ты уверен, что тебе надо таким образом извлекать данные? Почему нельзя передать итератор? Это было бы более красиво. А вообще, если все-таки нужно, попробуй STLPort.
-------------------- Волны гасят ветер... |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
В принципе, глядя на текущую реализацию STL в VC70, пройдет и такое:
Function(reinterpret_cast<void*>(it),my_cont.size()); или в С стиле: Function((void*)it,my_cont.size()); В принципе, я слышал, что собираются стандартизировать тип итератрора для таких контейнеров как vector, чтобы он был именно указателем на массив, ибо говорят, что этот факт и так все пользуют, полагая что иная реализация не логична. -------------------- Волны гасят ветер... |
|||
|
||||
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
в 7 не проходит, потому и возникла такая проблема.
Почему так лучше ? |
||||
|
|||||
| Fantasist |
|
||||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Да, действительно, странно. Это что ли в новом стандарте новые правила. Надо будет узнать. Раньше можно было конвертировать что угодно к чему угодно.
Рекомендуемый стиль. Во-первых, четко указывает намерение. То есть что ты конвертируешь не к классу наследнику, не используя операторы конвертации и прочие "правильные" преобразования, для коих существует dynamic_cast и static_cast (const_cast слегка слева, но тоже), а именно осуществляешь реинтерпритацию данных. Во-вторых, легче увидеть и найти такое преобразование в коде. А в VC70 твоя проблема решается просто: Function(it.base(),my_cont.size()); -------------------- Волны гасят ветер... |
||||
|
|||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Ого, что это? Как всегда. "Господа программисты, забудьте всё, что мы говорили, утверждали, на чём настаивали до этого. Сегодня это не актуально. Глядите сюда. Теперь всем делать так." Я надеюсь это расширение стандарта, а не новый подход. А то может MicroSoft и STL решила под себя... P.S. Простите за эмоции. |
|||
|
||||
| Fantasist |
|
|||
|
Лентяй ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: 4 Всего: 41 |
Да это извращение от Microsoft'а. Реализовать итератор как класс выполняющий функции указателя (там только один член - указатель, и все операции типичные для указателя) и определить метод, возвращающей этот указатель. Говорю вам, забейте на Микрософтовскую реализацию и возмите STLPort - это давно хорошо зарекомендовавшая себя библиотека. И не будет у вас проблем. А насчет стандарта. Он никак не ограничивает реализацию итератора. Она накладывает требования на нее, но совершенно не протестует, если он у тебя будет с расширенными возможностями. -------------------- Волны гасят ветер... |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Согласен насчёт StlPort, вещь рульная. И не хранит никакие данные контейнеров в статических компонентах класса (как в мелкософтовской реализаци - из-за чего контейнер, созданный в DLL, не работает в EXE).
А вот почему бы не сделать так:
? Вроде логично. -------------------- ![]() |
|||
|
||||
| DENNN |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Так вот волнуюсь я как раз из-за того, что через год выдет как-нибудь новая студия и у очердного кодера код компилится не будет. Когда я говорю "ну скомпилируйте в предыдущей студии, она же у вас есть", то некоторые не особо продвинутые граждане начинают крестится и говорить что я мол не использую новейшие достижения. А то что MFC из 6 и 7 не совместимы между собой, так это уже привело к забиванию на МС со всеми их шумными технологиями и использования либо WinAPI, либо нечто вроде GTK
сделать то можно, да только таких различных cтруктур в коде много. Водить множественное наследование тоже не выход, потому что способ лечит не причину а следствие |
||||
|
|||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Вот наконец-то до этого кода руки дошли. МС опять "радует":
компилер выдает ошибку: d:\Program Files\GeoFusion\GeoMatrix\src\examples\gmx_view\miniplayer\UniRender.cpp(425): error C2440: 'reinterpret_cast' : cannot convert from 'std::vector<_Ty,_Ax>::iterator' to 'void *' with [ _Ty=MyStruct, _Ax=std::allocator<MyStruct> ] вот такие пироги с котятами - их едят а они пищат Это сообщение отредактировал(а) DENNN - 6.10.2003, 12:24 |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
DENNN, я думаю твоя проблема лечится использованием проверенной STL вместо прилагаемой к VS7
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |