![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
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 раз(а) Репутация: ![]() ![]() ![]() |
Предлагаю сделать вот так... да, сработало. отлично! мне как-то в голову не пришло... а в детали реализации буста некогда было лезть. видимо, неявный конструктор с темплейтами как-то не срабатывает, причём именно в случае с мелкософтом - под линём-то всё зашибись. а с объявлением до версии 1300 - это скорее всего обход баги со старым компилером мелкософта - там вроде не соблюдалось объявление темплейтов по ISO и ещё были какие-то проблемы с typedef, я уже не помню точно. кстати, каким мелкософтом компилил? так, для уверенности... хотелось бы знать, так же с 2008 студией или нет? чтобы уж точно знать, имеет смысл её ставить или нет. но в общем мне полегчало, а то проект большой, кроссплатформа, вчера дома под линём такой шмат кода был написан, и вдруг такой облом под вендой случился ![]() а 38-й качнуть надо... профайл, я полагаю, не критичен. критичен буст! ![]() |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 10.6.2025, 8:29 |