如何从 std::runtime_error 继承?

Posted

技术标签:

【中文标题】如何从 std::runtime_error 继承?【英文标题】:How to inherit from 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

【问题讨论】:

【参考方案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) 
;

【讨论】:

以上是关于如何从 std::runtime_error 继承?的主要内容,如果未能解决你的问题,请参考以下文章

无法捕获 std::runtime_error

区别:std::runtime_error 与 std::exception()

为什么std :: runtime_error的c'tor采用对std :: string的常量引用?

误解 std::runtime_error 的 what() 函数

带有“std::runtime_error”的 C++0x random_device

与RCPP在Ubuntu Xenial扔的std :: runtime_error当段错误