crossplatform.ru

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


  Ответ в boost::function, template и MS compiler 8.0
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


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

дык, у меня типа везде unicode. а в MinGW всё прекрасно, но у них своё понимание реализации стандартов ISO для unicode. что-то совпадает с остальными компилерами, что-то - нет. а украшать свой код кучей #ifdef'ов как-то не особо хочется.
Andrew Selivanov Дата 26.2.2009, 12:29
 
Цитата(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, 11:55
 
Цитата(Andrew Selivanov @ 26.2.2009, 13:40) *
Предлагаю сделать вот так...


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

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

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

а 38-й качнуть надо... профайл, я полагаю, не критичен. критичен буст! :)
Andrew Selivanov Дата 26.2.2009, 11:40
  Предлагаю сделать вот так:

#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;
}
Litkevich Yuriy Дата 26.2.2009, 11:29
  Iron Bug, стоит в профиле указать пол. (я изначально думал, что мужской.)
Andrew Selivanov Дата 26.2.2009, 11:14
 
Цитата(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
Iron Bug Дата 26.2.2009, 10:24
  да, ещё уточнение: буст у меня 1.37.0
Iron Bug Дата 26.2.2009, 9:49
  Напоролась на багу с 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. Пока вроде я не нашла упоминания такой баги у них в листах.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 19.4.2024, 3:18