6

本当に単純な例外クラスを定義しようとしています。非常に単純なので、.h ファイルのみに保持したいのですが、コンパイラは .h ファイルを好みませんthrow()。コード:

#include <exception>
#include <string>

class PricingException : public virtual std::exception
{
private:
    std::string msg;
public:
        PricingException(std::string message) : msg(message) {}
        const char* what() const throw() { return msg.c_str(); }
        ~PricingException() throw() {}
};

GCC は次のエラーを返します。

/home/ga/dev/CppGroup/MonteCarlo/PricingException.h:13: error: expected unqualified-id before ‘{’ token
/home/ga/dev/CppGroup/MonteCarlo/PricingException.h:14: error: expected unqualified-id before ‘{’ token

の行の場合throw()。それを修正する方法はありますか?

編集

問題のあるメソッドの本体を削除しようとしました。

virtual ~PricingException() throw();// {}

そして今、私はさらに奇妙なエラーメッセージを受け取ります:

/home/ga/dev/CppGroup/MonteCarlo/PricingException.h:14: error: looser throw specifier for ‘virtual PricingException::~PricingException()’
/usr/include/c++/4.5/exception:65: error:   overriding ‘virtual std::exception::~exception() throw ()’

それは私のスロー指定子を無視しました!

4

5 に答える 5

4

代わりに C++0x 構文を試してみてください。g++ 4.5 はそれをサポートするのに十分なほど最近のものかもしれません:

const char* what() const noexcept { return msg.c_str(); }

ただし、これは問題ではありません (ドラフト 3242 のセクション[except.spec]:

次の場合、 2 つの例外仕様互換性があります。

  • フォームに関係なく、どちらも投げません (以下を参照)。
  • どちらもnoexcept(定数式)の形式を持ち、定数式は同等です。
  • 1 つの例外仕様は、すべての例外を許可するnoexcept仕様であり、もう 1 つはthrow(type-id-list)の形式である、または
  • 両方とも、調整されたタイプの同じセットを持つ動的例外仕様です。

.

仮想関数にexception-specificationがある場合、派生クラスでその仮想関数をオーバーライドする関数のすべての宣言 (定義を含む) は、基本クラスの仮想関数の例外仕様によって許可されている例外のみを許可する必要があります。

.

例外指定のない関数、または定数式が false を生成する形式の定数式の例外指定を持つ関数は、すべての例外を許可します定数式がを生成する、、または定数式の形式である場合、例外仕様非スローです。非スローの例外仕様を持つ関数は、例外を許可しません。noexcept()throw()noexceptnoexcept()true

そのため、これらの変更がより完全に実装されている g++ の新しいビルドを試してください。

于 2011-03-29T15:05:23.927 に答える
3

C++0x で見つけた最も近いものは次のとおりです。

15.4 例外指定 [except.spec]

2 例外仕様は、宣言または定義の最上位の型である関数型、関数型へのポインター、関数型への参照、またはメンバー関数型へのポインターの関数宣言子、またはそのような関数宣言子でパラメーターまたは戻り値の型として現れる型。

定義での例外仕様の使用を禁止する可能性があるように思えます。

于 2011-03-29T13:23:10.730 に答える
1

g++ のいくつかのバージョンでこれを再現できませんでした。最も可能性の高い問題は、以前にインクルードされたヘッダー ファイルに問題があり、その問題が最終的にコンパイラに問題を引き起こしていることthrowです。

于 2011-03-29T14:24:46.583 に答える
0

ついに見つけた!@Mike Seymourは彼のコメントに正しかった-ファイルnr3.h(Numerical Recepiesコードの一部)にマクロがthrow(message)定義されていることがわかった。

私が理解していないのは、この.hファイルを含まないファイルのコンパイルに影響を与える理由です...

とにかく、Visual Studioのコンパイル順序などが異なっていたと思うので、gccの下ではなく、そこでコンパイルしたのは幸運でした。

于 2011-03-31T11:43:43.867 に答える
0

()なしで試しthrowましたか?この例では(私は.cppファイルでそれを知っています)、しかしあなたはすべてのスローが括弧を持っていないことがわかります

http://www.glenmccl.com/eh_cmp.htm

于 2011-03-29T13:49:15.003 に答える