6

我正在尝试定义一个非常简单的异常类。因为它非常简单,我只想将它保存在 .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,第 3 节[except.spec]

如果满足以下条件,则两个异常规范兼容的:

  • 两者都是非投掷(见下文),无论其形式如何,
  • 两者都具有常量表达式的形式noexcept()并且常量表达式是等价的,
  • 一个异常规范是允许所有异常的noexcept 规范,另一个是throw(type-id-list)形式,或者
  • 两者都是具有相同调整类型集的动态异常规范。

.

如果虚函数具有异常规范,则在任何派生类中覆盖该虚函数的任何函数的所有声明(包括定义)都应仅允许基类虚函数的异常规范允许的异常。

.

没有异常规范或具有常量表达式形式的异常规范(其中常量表达式产生 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

你试过throw没有()吗?在这个例子中(我知道它在 .cpp 文件中)但是你看到所有的 throws 都没有括号

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

于 2011-03-29T13:49:15.003 回答
0

终于找到了!@Mike Seymour 在他的评论中是正确的 - 事实证明,在文件 nr3.h(数字接收代码的一部分中定义了一个宏throw(message)

我不明白为什么它会影响不包含此 .h 文件的文件的编译...

无论如何,我认为 Visual Studio 有不同的编译顺序或其他东西,所以它在那里编译而不是在 gcc 下编译纯粹是运气。

于 2011-03-31T11:43:43.867 回答