在C++中使用更宽松的throw说明符

MLS*_*MLS 7 c++ compiler-construction xcode gcc

我收到的错误是:

错误:'virtual CPLAT :: CP_Window :: ~CP_Window()'的松散抛出说明符

在析构函数上,我以前从未听说过这一点,一些谷歌搜索说这可能是一个GCC 4问题,我不知道如何解决,因为我需要GCC 4来构建一个通用二进制文件.

我的环境:OS X 10.6,XCode 3.2.2,GCC 4构建通用二进制文件.

有什么问题?

Jon*_*vis 12

我假设CPLAT有一个基类?我也猜测你没有在CPLAT的析构函数上放一个throw说明符?

您可以throw(X)在函数签名的末尾放置(其中X是以逗号分隔的异常列表),以指示允许抛出的异常.如果将put throw()作为throw说明符,则表示不能从该函数抛出任何异常.使用析构函数执行此操作是相当常见的,因为您不希望析构函数抛出异常.

覆盖具有throw说明符的函数的类不能具有比被覆盖的函数更宽松的抛出说明符(列出更多异常),因为这将指示派生类的'函数可能违反基类'函数的throw说明符.没有throw说明符意味着可以从该函数抛出任何异常,因此它就像它可以获得的那样松散.

很有可能,您需要添加throw()到CPLAT析构函数的函数签名的末尾.

编辑:顺便说一句,我应该补充一点,你可能不想使用throw说明符(除了throw()析构函数),而不是真的知道那就是你想要的.与Java的已检查异常不同,它们不会在编译时捕获,而是在运行时终止程序(如果违反).所以,除非你知道自己在做什么,否则最好不要使用它们.

  • 我的stl实现将std :: exception的析构函数声明为`~exception()throw();`现在,如果我去使用它作为我自己的异常的基础,我必须在每个派生类中声明一个析构函数,即使没有任何东西也是如此在那个析构函数中做,因为如果我不这样做,gcc会抱怨.有没有办法避免这种多余的声明? (2认同)
  • 不是我知道的,如果没有别的,因为它在技术上并不是多余的.如果你没有定义析构函数,你会得到一个没有抛出说明符的析构函数.因此,它具有错误的功能签名.你必须通过使用空的throw说明符定义它来给它正确的函数签名:`throw()`.如果编译器只是为你做了这件事会很好,但显然不是那么聪明. (2认同)

Edw*_*nge 5

http://www.agapow.net/programming/cpp/looser-throw-specifier

你在~CP_Window()声明之后放了throw()吗?

谷歌搜索中的顶级链接"looser throw specifier"BTW.