【问题标题】:looser throw specifier for in C++C++ 中更宽松的抛出说明符
【发布时间】:2011-02-10 20:19:29
【问题描述】:

我收到一条错误消息:

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

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

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

有什么问题?

【问题讨论】:

    标签: c++ xcode gcc compiler-construction


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 我的 stl 实现将 std::exception 的析构函数声明为 ~exception() throw(); 现在如果我将它用作我自己的异常的基础,我必须在每个派生类中声明一个析构函数,即使有在那个析构函数中无事可做,因为如果我不这样做,gcc 就会抱怨。有没有办法避免这种多余的声明?
    • 据我所知,如果没有别的,因为它在技术上不是多余的。如果你没有定义析构函数,你会得到一个没有 throw 说明符的析构函数。所以,它有错误的函数签名。您必须通过使用空抛出说明符定义它来为其提供正确的函数签名:throw()。如果编译器只是为你这样做就好了,但它显然不是那么聪明。
    【解决方案2】:

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

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

    Google 搜索“宽松的抛出说明符”BTW 中的顶部链接。

    【讨论】:

    • 截至 2012 年 2 月 14 日,排名靠前的结果现在是这篇文章。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    相关资源
    最近更新 更多