У меня есть код, который отлично компилируется под Linux, но я пытаюсь перенести его на Windows. Я использовал предварительно скомпилированные двоичные файлы Boost 1.50 из Boost Pro, но когда я компилирую свой код, я получаю эту загадочную ошибку:
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 нет проблем с этим в любом случае.
[Примечание: приведенный выше код не является моим настоящим кодом, но при компиляции возникает та же проблема. Пожалуйста, избегайте комментариев о том, что выбрасывать целые числа — это плохо и тому подобное, так как это всего лишь тривиальный пример на случай, если кто-то захочет воспроизвести проблему.]