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

时间:2010-04-21 23:19:37

标签: c++ xcode gcc compiler-construction

我收到的错误是:

错误:'虚拟CPLAT :: CP_Window :: ~CP_Window()'的错误抛出说明符

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

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

问题是什么?

2 个答案:

答案 0 :(得分:12)

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

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

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

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

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

答案 1 :(得分:5)

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

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

Google搜索中的热门链接“looser throw specifier”BTW。