У меня есть код, который компилируется под Linux, но я пытаюсь его перенести в Windows. Я использовал подпиточный 1.50 скомпилированных бинарников от повышающего Pro, но когда я скомпилировать свой код, я получаю эту загадочную ошибку:boost :: bind не работает в VC++ 2010 при связывании функции, которая генерирует исключения
error C2664: 'boost::_bi::bind_t<R,F,L>::bind_t(const boost::_bi::bind_t<R,F,L> &)' :
cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>'
to 'const boost::_bi::bind_t<R,F,L> &'
C:\Program Files (x86)\boost\boost_1_50\boost\bind\bind_cc.hpp [line] 50
Ошибки наиболее бесполезна, так как он показывает глубоко в заголовочных файлах Boost, без указания где в моем коде проблема. Тем не менее, комментируя различные блоки кода, я сузил его до этого в качестве причины:
void test(int a)
throw (int) // removing this line makes it compile
{
return;
}
...
boost::function<void(int)> fn = boost::bind<void>(test, _1);
Это работает, если я удалю throw
спецификатора в определении функции. Неважно, что я бросаю, будь то класс или просто int
. Я что-то делаю неправильно, или вы не можете привязываться к функциям, которые генерируют исключения в Visual C++? Документы Boost Bind, похоже, не предлагают никаких проблем с этим, и у GCC нет проблем с ним в любом случае.
[примечание: код выше не является моим фактическим кодом, но при компиляции он проявляет ту же проблему. Пожалуйста, избегайте комментариев о том, как бросать ints плохие и тому подобное, поскольку это только должно быть тривиальным примером, если кто-то хочет воспроизвести проблему.]
Вы должны думать об удалении динамических броска спецификаторов в коде, они устарели в любом случае. – PlasmaHH
У нас была аналогичная проблема в одном из наших старых проектов и в итоге удалили все броски из наших флеш-объявлений. Честно говоря, они не очень полезны в наши дни и в любом возрасте. – steveg89