C++ 中更宽松的抛出说明符

问题描述 投票:0回答:2

我收到一条错误消息:

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

关于析构函数,我以前从未听说过这个,一些 Google 搜索说这可能是 GCC 4 问题,我不确定如何解决这个问题,因为我需要 GCC 4 来构建通用二进制文件。

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

问题是什么?

c++ xcode gcc
2个回答
12
投票

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

您可以将

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

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

很可能,您需要将

throw()
添加到 CPLAT 析构函数的函数签名末尾。

编辑:顺便说一句,我可能应该补充一点,您可能不想在不真正知道这就是您想要的的情况下使用抛出说明符(除了析构函数上的

throw()
)。与 Java 的检查异常不同,它们不会在编译时捕获,而是在运行时如果违反则终止程序。因此,除非您知道自己在做什么,否则最好不要使用它们。


5
投票

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

您是否将 throw() 放在 ~CP_Window() 声明之后?

谷歌搜索“宽松投掷说明符”中的顶部链接顺便说一句。

© www.soinside.com 2019 - 2024. All rights reserved.