0

boost::formatを使用できない新しいプロジェクトがあります。ブーストによる仮想関数〜basic_altstringbufのオーバーライドに「throw()」がないことを訴えるコンパイラエラーが発生します。boost :: formatを使用する最も簡単な試みでさえ、それを行います。

私はそれがうまくいく他のプロジェクトを持っています。新しいプロジェクトがブーストとVC++インクルードに同じインクルードパスを使用していることを確認しました。すべてのプロジェクトで、[C++例外を有効にする]が[はい]に設定されています。私が思いつくことができる唯一の説明は、動作するプロジェクトには、std::include-filesのそれらの卑劣な例外仕様を無効にするいくつかの#DEFINEまたはいくつかの設定があるということです。しかし、それがどこにあるのか、私にはわかりません。何か案は?

エラー1エラーC2694:'boost :: io :: basic_altstringbuf ::〜basic_altstringbuf(void)':仮想関数のオーバーライドには、基本クラスの仮想メンバー関数よりも制限の少ない例外指定があります' std :: basic_streambuf <_Elem、_Traits> ::〜basic_streambuf (void)throw()

編集:当然の質問:VS ++ 2012に、std ::ヘッダーファイルが例外仕様なしでインクルードされる原因となるプロパティアイテムはありますか?-例外をオフにすることを除いて、それは?

4

2 に答える 2

2

緑のチェックマークの元の所有者の要求に応じて、この要約を提出します。

  1. バグはMicrosoft側、C ++標準ライブラリインターフェイスのヘッダーファイル、および「言語拡張機能の無効化」が設定されていない場合のVC++コンパイラにあります。ヘッダーファイルには、標準で要求されていない例外仕様が含まれています。「言語拡張」が有効になっていない場合、コンパイラは無効なコードを受け入れます。バグレポートを提出しました。

  2. Boostは、ネストされたインクルードファイルに7文字を追加することで、この特定のケースで問題を回避できます。つまり、alt_sstream_impl.hppの65行目の「throw()」です。バグが彼らのコードにないことを明らかにしましたが、私もブーストを使ってレポートを提出しました。回避策を提案しているだけです。

面倒な詳細はすべて、上記の2つのレポートに記載されています。

于 2012-10-07T21:54:25.663 に答える
0

プリプロセッサの定義を確認してください。

オンにして詳細ログを調べ、に渡される正確なフラグを確認することができます。cl.exe

前処理されたソースを保持し、古い(動作中の)プロジェクトのバージョンを新しい(失敗した)プロジェクトと比較することができます。

私の直感によると、新しいプロジェクトでは定義されていない古いプロジェクトで-Dを使用して別の何かが#定義/渡されています(WINVERマクロタイプを考えてください)


投稿された新しい回答を参照してください:VC ++ 2012およびBoostの非互換性-ライブラリヘッダーの`throw()`仕様

OPによる編集、JiveDadson-「Microsoft言語拡張機能」を有効/無効にする/Zaであることが判明しました。Visual Studioの競合は、C ++標準で、オーバーライドする関数よりも「throw()」カテゴリの制限が少ない仮想関数オーバーライドがある場合、プログラムがコンパイルされないことを要求していることです。Boostには、basic_streambufから派生したクラスがあり、「throw()」がない仮想デストラクタがあります。元のデストラクタには、その邪悪な花綱があります。MS言語拡張機能をオンにすると、新しいプロジェクトはboost::formatをコンパイルします。

だから問題は、誰が間違っているのか、そしてどのように?そのデストラクタにthrow()を配置することは標準に準拠していますか?望ましい動作(つまり、私が望む)は実際には「拡張」ですか?MSがいくつかの標準C++11機能を「拡張機能」と見なしたことを思い出しているようですが、正しく覚えているかどうかはわかりません。とにかく、彼らが興味を持っているかどうかを決めるのはブースターに任せます。https://svn.boost.org/trac/boost/ticket/7477

于 2012-10-06T23:06:46.260 に答える