5

私はこの問題を見てきましたが、どこに問題があるのか​​ わかりません。私は C++ の専門家ではないので、これで問題ないように見えます。これは、前回試したときに問題なくコンパイルできました。

namespace yaaf {

/************************************************************************/
/*                                                                                          */
/*     Standard YAAF Errors                                                            */
/*                                                                                          */
/************************************************************************/

/*     XGYAAFError
 *
 *          YAAF Error; this is the root of my YAAF errors, and is
 *     a descendant of the standard exception class
 */

class XGYAAFError : public std::exception {
     public:
          explicit XGYAAFError(const char *);
          explicit XGYAAFError(const std::string &err);

          const char *what() const throw()
          {
              return fError.c_str();
          }

     private:
          std::string fError;
};

} // namespace yaaf

#endif

GCC ライブラリの基本クラス...

  /**
   *  @brief Base class for all library exceptions.
   *
   *  This is the base class for all exceptions thrown by the standard
   *  library, and by certain language expressions.  You are free to derive
   *  your own %exception classes, or use a different hierarchy, or to
   *  throw non-class data (e.g., fundamental types).
   */
  class exception 
  {
  public:
    exception() throw() { }
    virtual ~exception() throw();

    /** Returns a C-style character string describing the general cause
     *  of the current error.  */
    virtual const char* what() const throw();
  };

ビルドしようとすると、「オーバーライド関数の仕様が基本バージョンよりも緩い」というエラーが表示されます。

これは、C++ 言語の変更 (2004 年頃??) と、派生クラス内でポインターを宣言できる場所に関係している可能性があると思います。しかし、それがここに当てはまるかどうか、およびこれを修正する方法がわかりません。

具体的に何が間違っているか、またはこれを修正する方法についてのアイデアをいただければ幸いです。

ありがとう

4

1 に答える 1

5

XGYAAFErrortype のメンバー変数をstd::string持ち、例外をスローできる非自明なデストラクタを持ちます。 std::exceptionご覧のとおり、例外をスローしないと宣言されたユーザー宣言のデストラクタがあります。

したがって、ルールをオーバーライドするため、 には、例外指定XGYAAFErrorを伴うユーザー宣言のデストラクタが必要です。この件については、 「例外仕様は仮想デストラクタのオーバーライドにどのように影響しますか?」throw()という質問で詳しく説明しました。詳細については、その質問を参照してください。

于 2012-08-06T23:04:49.233 に答える