【问题标题】:How to inherit from std::runtime_error?如何从 std::runtime_error 继承?
【发布时间】:2013-05-13 00:03:03
【问题描述】:

例如:

#include <stdexcept>
class A { };
class err : public A, public std::runtime_error("") { };
int main() {
   err x;
   return 0;
}

("")runtime_error 之后我得到:

error: expected '{' before '(' token
error: expected unqualified-id before string constant
error: expected ')' before string constant

否则(没有(""))我明白了

In constructor 'err::err()':
error: no matching function for call to 'std::runtime_error::runtime_error()'

怎么了?

(你可以在这里测试:http://www.compileonline.com/compile_cpp_online.php

【问题讨论】:

    标签: c++ inheritance runtime-error


    【解决方案1】:

    这是正确的语法:

    class err : public A, public std::runtime_error
    

    而不是:

    class err : public A, public std::runtime_error("")
    

    正如您在上面所做的那样。如果你想给std::runtime_error的构造函数传递一个空字符串,可以这样:

    class err : public A, public std::runtime_error
    {
    public:
        err() : std::runtime_error("") { }
    //        ^^^^^^^^^^^^^^^^^^^^^^^^
    };
    

    这是一个live example 来显示代码编译。

    【讨论】:

    • 我在compileonline.com/compile_cpp_online.php上试过了,你的建议给了我no matching function for call to 'std::runtime_error::runtime_error()'
    • @MiloChen:你确定你复制的所有内容都正确吗?我添加了一个指向显示代码正确编译的实时示例的链接
    • 哦,我明白了,如果我错过了构造函数err() : std::runtime_error("") { },它将无法编译。不是我想要传递一个空字符串——我是强制到的。
    • @MiloChen:如果此答案解决了您的问题,请考虑将其标记为已接受 :)
    【解决方案2】:

    想补充一点,err 类可以接收字符串消息,然后简单地将其转发给std::runtime_error,或者默认为空字符串,如下所示:

    #pragma once
    
    #include <stdexcept>
    
    class err : public std::runtime_error
    {
    public:
        err(const std::string& what = "") : std::runtime_error(what) {}
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多