![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Iron Bug |
![]() ![]()
Сообщение
#1
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Напоролась на багу с boost::function + MS compiler 8.0
Проявляется при применении template'ов функций и работе с boost::function при компиляции в MSVS 2005 SP1. Рассмотрим вот такой маленький пример:
В общем, казалось бы, ну куда проще... Задаём темплейт для функции, присваиваем указателю параметризованную функцию... В примере реализованы два указателя - один через boost::function, второй - классический, определённый как обычный указатель на функцию. Это прекрасно компилится, без единого ворнинга, НО! Сгенерированный компилятором MS 8.0 код даёт ран-тайм ошибку - нулевая функция в boost_func! А вот если закомментировать вызов boost_func - то всё нормально, "классический" указатель работает. Все остальные протестированные мной компиляторы дают нормальный код, который правильно выполняется. А вот мелкософтовский даёт такой потайной баг. Я также пробовала использовать "portable" синтакс библиотеки boost::function - то есть через boost::function1<bool,bool> - совершенно та же ситуация. Может, у кого есть 2008 MS студия - надо бы под ней проверить, как эта конструкция работает. Я её ставить не хочу пока, в ней много рюшек и никаких плюсов для C++, судя по описаниям релиза. Но если там поправлена эта бага - то, видать, придётся обновить компилер. Если и под ней не компилится - буду писать в boost. Пока вроде я не нашла упоминания такой баги у них в листах. |
|
|
Iron Bug |
![]()
Сообщение
#2
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
да, ещё уточнение: буст у меня 1.37.0
|
|
|
Andrew Selivanov |
![]()
Сообщение
#3
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
Напоролась на багу с boost::function + MS compiler 8.0 На вскидку собрал с 1.38 - те же грабли
|
|
|
Litkevich Yuriy |
![]()
Сообщение
#4
|
![]() разработчик РЭА ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: ![]() ![]() ![]() |
Iron Bug, стоит в профиле указать пол. (я изначально думал, что мужской.)
|
|
|
Andrew Selivanov |
![]() ![]()
Сообщение
#5
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
Предлагаю сделать вот так:
|
|
|
Iron Bug |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
Предлагаю сделать вот так... да, сработало. отлично! мне как-то в голову не пришло... а в детали реализации буста некогда было лезть. видимо, неявный конструктор с темплейтами как-то не срабатывает, причём именно в случае с мелкософтом - под линём-то всё зашибись. а с объявлением до версии 1300 - это скорее всего обход баги со старым компилером мелкософта - там вроде не соблюдалось объявление темплейтов по ISO и ещё были какие-то проблемы с typedef, я уже не помню точно. кстати, каким мелкософтом компилил? так, для уверенности... хотелось бы знать, так же с 2008 студией или нет? чтобы уж точно знать, имеет смысл её ставить или нет. но в общем мне полегчало, а то проект большой, кроссплатформа, вчера дома под линём такой шмат кода был написан, и вдруг такой облом под вендой случился ![]() а 38-й качнуть надо... профайл, я полагаю, не критичен. критичен буст! ![]() |
|
|
Andrew Selivanov |
![]()
Сообщение
#7
|
![]() Участник ![]() ![]() Группа: Участник Сообщений: 249 Регистрация: 9.10.2007 Из: Москва Пользователь №: 3 Спасибо сказали: 15 раз(а) Репутация: ![]() ![]() ![]() |
да, сработало. отлично! мне как-то в голову не пришло... а в детали реализации буста некогда было лезть. видимо, неявный конструктор с темплейтами как-то не срабатывает, причём именно в случае с мелкософтом - под линём-то всё зашибись. а с объявлением до версии 1300 - это скорее всего обход баги со старым компилером мелкософта - там вроде не соблюдалось объявление темплейтов по ISO и ещё были какие-то проблемы с typedef, я уже не помню точно. Я именно с function в детали особо не лазил, в основном лазил в детали asio и thread ![]() Цитата кстати, каким мелкософтом компилил? так, для уверенности... хотелось бы знать, так же с 2008 студией или нет? чтобы уж точно знать, имеет смысл её ставить или нет. Также 8.0, про 9.0 ничего сказать не могу, не юзал, не слышал, вообще я в основном связкой Mingw 3.4.5 + Eclipse пользуюсь. Хотя Mingw тоже уже начинает доставать, взять хотя бы отсутствие нормальных локалей... ну и мнОгое другое... Цитата но в общем мне полегчало, а то проект большой, кроссплатформа, вчера дома под линём такой шмат кода был написан, и вдруг такой облом под вендой случился ![]() Шмат кода, шесть шматов багов и поперчить ![]() Цитата а 38-й качнуть надо... профайл, я полагаю, не критичен. критичен буст! ![]() ![]() |
|
|
Iron Bug |
![]()
Сообщение
#8
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
в основном связкой Mingw 3.4.5 + Eclipse пользуюсь. Хотя Mingw тоже уже начинает доставать, взять хотя бы отсутствие нормальных локалей... дык, у меня типа везде unicode. а в MinGW всё прекрасно, но у них своё понимание реализации стандартов ISO для unicode. что-то совпадает с остальными компилерами, что-то - нет. а украшать свой код кучей #ifdef'ов как-то не особо хочется. |
|
|
![]() ![]() ![]() |
![]() |
Текстовая версия | Сейчас: 18.2.2025, 10:13 |