我已经看过这个问题但没看到问题所在。我不是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年)有关,你可以在派生类中声明指针。但我不确定这是不是这样,以及如何解决这个问题。
有关具体错误或如何解决这个问题的任何想法都表示赞赏。
由于
答案 0 :(得分:5)
XGYAAFError
有一个std::string
类型的成员变量,它有一个非常重要的析构函数,可以抛出任何异常。如你所见,std::exception
有一个用户声明的析构函数,声明为不抛出异常。
因此,由于覆盖规则,XGYAAFError
需要一个用户声明的析构函数,其中包含throw()
异常规范。我在问题"How does an exception specification affect virtual destructor overriding?"中提供了对此主题的深入解释。请参阅该问题以获取详细信息。