crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> boost::function, template и MS compiler 8.0, внимание: проблема компилятора!
Iron Bug
  опции профиля:
сообщение 26.2.2009, 9:49
Сообщение #1


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Напоролась на багу с boost::function + MS compiler 8.0

Проявляется при применении template'ов функций и работе с boost::function при компиляции в MSVS 2005 SP1.

Рассмотрим вот такой маленький пример:

#include <boost/function.hpp>

template <class TResult>
TResult foo_template(TResult bar)
{
    return bar;
}

int main(void)
{
    boost::function<bool(bool)> boost_func = foo_template<bool>;

    bool (*simple_func)(bool);
    simple_func = &foo_template<bool>;

    boost_func(true);        // ooops!!! throws an exception here: the func is empty!
    (*simple_func)(false); // this works fine

    return 0;
}


В общем, казалось бы, ну куда проще... Задаём темплейт для функции, присваиваем указателю параметризованную функцию...
В примере реализованы два указателя - один через boost::function, второй - классический, определённый как обычный указатель на функцию.

Это прекрасно компилится, без единого ворнинга, НО! Сгенерированный компилятором MS 8.0 код даёт ран-тайм ошибку - нулевая функция в boost_func! А вот если закомментировать вызов boost_func - то всё нормально, "классический" указатель работает.

Все остальные протестированные мной компиляторы дают нормальный код, который правильно выполняется. А вот мелкософтовский даёт такой потайной баг.

Я также пробовала использовать "portable" синтакс библиотеки boost::function - то есть через boost::function1<bool,bool> - совершенно та же ситуация.

Может, у кого есть 2008 MS студия - надо бы под ней проверить, как эта конструкция работает. Я её ставить не хочу пока, в ней много рюшек и никаких плюсов для C++, судя по описаниям релиза. Но если там поправлена эта бага - то, видать, придётся обновить компилер.

Если и под ней не компилится - буду писать в boost. Пока вроде я не нашла упоминания такой баги у них в листах.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 26.2.2009, 10:24
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


да, ещё уточнение: буст у меня 1.37.0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 26.2.2009, 11:14
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Iron Bug @ 26.2.2009, 9:49) *
Напоролась на багу с boost::function + MS compiler 8.0


На вскидку собрал с 1.38 - те же грабли
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) // Обход какого то бага для студии эээ выше 7.0?
  template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS>
  typename BOOST_FUNCTION_FUNCTION<
      R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>::result_type
   BOOST_FUNCTION_FUNCTION<R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>
  ::operator()(BOOST_FUNCTION_PARMS) const
  {
    if (this->empty()) // < -- падаем здесь
      boost::throw_exception(bad_function_call());

    return reinterpret_cast<const vtable_type*>(vtable)->invoker
             (this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
  }
#endif
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 26.2.2009, 11:29
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Iron Bug, стоит в профиле указать пол. (я изначально думал, что мужской.)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 26.2.2009, 11:40
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Предлагаю сделать вот так:

#include <boost/function.hpp>

template <class TResult>
TResult foo_template(TResult bar)
{
    return bar;
}

int main(void)
{
    boost::function<bool(bool)> boost_func(foo_template<bool>); // <-- вызываем конструктор

    bool (*simple_func)(bool);
    simple_func = &foo_template<bool>;

    boost_func(true);        // ooops!!! throws an exception here: the func is empty!
    (*simple_func)(false); // this works fine

    return 0;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 26.2.2009, 11:55
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Andrew Selivanov @ 26.2.2009, 13:40) *
Предлагаю сделать вот так...


да, сработало. отлично! мне как-то в голову не пришло... а в детали реализации буста некогда было лезть. видимо, неявный конструктор с темплейтами как-то не срабатывает, причём именно в случае с мелкософтом - под линём-то всё зашибись. а с объявлением до версии 1300 - это скорее всего обход баги со старым компилером мелкософта - там вроде не соблюдалось объявление темплейтов по ISO и ещё были какие-то проблемы с typedef, я уже не помню точно.

кстати, каким мелкософтом компилил? так, для уверенности... хотелось бы знать, так же с 2008 студией или нет? чтобы уж точно знать, имеет смысл её ставить или нет.

но в общем мне полегчало, а то проект большой, кроссплатформа, вчера дома под линём такой шмат кода был написан, и вдруг такой облом под вендой случился :)

а 38-й качнуть надо... профайл, я полагаю, не критичен. критичен буст! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 26.2.2009, 12:29
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Iron Bug @ 26.2.2009, 11:55) *
да, сработало. отлично! мне как-то в голову не пришло... а в детали реализации буста некогда было лезть. видимо, неявный конструктор с темплейтами как-то не срабатывает, причём именно в случае с мелкософтом - под линём-то всё зашибись. а с объявлением до версии 1300 - это скорее всего обход баги со старым компилером мелкософта - там вроде не соблюдалось объявление темплейтов по ISO и ещё были какие-то проблемы с typedef, я уже не помню точно.

Я именно с function в детали особо не лазил, в основном лазил в детали asio и thread :)

Цитата
кстати, каким мелкософтом компилил? так, для уверенности... хотелось бы знать, так же с 2008 студией или нет? чтобы уж точно знать, имеет смысл её ставить или нет.

Также 8.0, про 9.0 ничего сказать не могу, не юзал, не слышал, вообще я в основном связкой Mingw 3.4.5 + Eclipse пользуюсь. Хотя Mingw тоже уже начинает доставать, взять хотя бы отсутствие нормальных локалей... ну и мнОгое другое...

Цитата
но в общем мне полегчало, а то проект большой, кроссплатформа, вчера дома под линём такой шмат кода был написан, и вдруг такой облом под вендой случился :)

Шмат кода, шесть шматов багов и поперчить ;)

Цитата
а 38-й качнуть надо... профайл, я полагаю, не критичен. критичен буст! :)

:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 26.2.2009, 12:46
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


Цитата(Andrew Selivanov @ 26.2.2009, 14:29) *
в основном связкой Mingw 3.4.5 + Eclipse пользуюсь. Хотя Mingw тоже уже начинает доставать, взять хотя бы отсутствие нормальных локалей...

дык, у меня типа везде unicode. а в MinGW всё прекрасно, но у них своё понимание реализации стандартов ISO для unicode. что-то совпадает с остальными компилерами, что-то - нет. а украшать свой код кучей #ifdef'ов как-то не особо хочется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 21:21