我正在尝试定义一个非常简单的异常类。因为它非常简单,我只想将它保存在.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 ()’
它只是忽略了我的throw说明符!
答案 0 :(得分:4)
尝试使用C ++ 0x语法,g ++ 4.5可能已经足够支持它了:
const char* what() const noexcept { return msg.c_str(); }
然而,这应该不重要(来自第3242号草案,第[except.spec]
部分的措辞:
如果符合以下情况,异常规范
- 两者都是非投掷品(见下文),无论其形式如何,
- 的格式均为
noexcept(
常量表达式)
,常量表达式等效,- 一个异常规范是 noexcept-specification ,允许所有异常,另一个是
throw(
type-id-list < / em>)
或- 两者都是动态异常规范,它们具有相同的调整类型集。
如果虚函数具有异常 - 规范,则在任何派生类中覆盖该虚函数的任何函数的所有声明(包括定义)都只允许基类虚函数的异常规范。
没有异常规范或具有
noexcept(
常量表达式 {{{em>异常规范的函数1}} 常量表达式产生的错误允许所有异常。 异常规范是 非投掷如果格式为)
,throw()
或noexcept
常量表达式noexcept(
,其中常量表达式产生)
。具有非抛出异常规范的函数不允许任何异常。
因此,尝试更新的g ++版本,可以更全面地实现这些更改。
答案 1 :(得分:3)
我在C ++ 0x中找到的最接近的是:
15.4异常规范[except.spec]
2异常规范只应出现在函数类型的函数声明符,函数类型的指针,函数类型的引用或成员函数类型的指针上,该成员函数类型是声明或定义的顶级类型,或者在函数声明符中出现为参数或返回类型的类型。
在我看来,它可能不允许在定义上使用异常规范。
答案 2 :(得分:1)
我无法在几个版本的g ++中重现这一点。最可能的问题是,先前包含的头文件存在一个问题,即当它看到throw
但最终导致编译器出现问题时,最终会导致编译器出现问题。
答案 3 :(得分:0)
你是否尝试了throw
而没有()?在这个例子中(我知道它在.cpp文件中),但你看到所有抛出都没有括号
答案 4 :(得分:0)
终于找到了! @Mike Seymour在他的评论中是正确的 - 事实证明,在文件nr3.h(Numerical Recepies代码的一部分)中,定义了一个宏throw(message)
。
我不明白为什么它会影响不包含此.h文件的文件的编译...
无论如何,我认为Visual Studio有一个不同的编译顺序或者什么,所以它是纯粹的运气,它在那里编译而不是在gcc下。