C ++中的内联throw()方法

时间:2011-03-29 12:52:47

标签: c++ gcc throw

我正在尝试定义一个非常简单的异常类。因为它非常简单,我只想将它保存在.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说明符!

5 个答案:

答案 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文件中),但你看到所有抛出都没有括号

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

答案 4 :(得分:0)

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

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

无论如何,我认为Visual Studio有一个不同的编译顺序或者什么,所以它是纯粹的运气,它在那里编译而不是在gcc下。