1

Linuxで正常にコンパイルされるコードがいくつかありますが、それをWindowsに移植しようとしています。BoostProのBoost1.50プリコンパイル済みバイナリを使用しましたが、コードをコンパイルすると、次の不可解なエラーが発生します。

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はどちらの方法でも問題を抱えていません。

[補足:上記のコードは私の実際のコードではありませんが、コンパイルすると同じ問題が発生します。誰かが問題を再現したい場合の些細な例にすぎないので、intを投げるのが悪いなどについてのコメントは避けてください。]

4

1 に答える 1

2

コードが VC++ で失敗する理由がわかりません。ただし、例外指定は非常に微妙な影響をもたらす可能性があるため、一般的には避けるのが最善です。Herb Sutter による次の優れたコラム「A Pragmatic Look at Exception Specifications 」を参照してください。

ですから、今日の時点でコミュニティとして私たちが学んだ最善のアドバイスは次のとおりです。

教訓 #1: 例外仕様を記述しないでください。

教訓その2: たぶん空のものを除いて、しかし私があなただったら、それさえも避けます.

于 2012-08-13T11:48:04.257 に答える