如何使用完全限定的名称继承基类的构造函数?

时间:2019-05-24 15:03:53

标签: c++

假设我有以下课程:

this.route.params.pipe(
    switchMap(
        (params: Params) => {
            this.pageParam['permalink'] = params['permalink'];
            ...
        }
    )
)

要将class foo : public std::runtime_error {}; 的构造函数引入我的班级,您可能认为我可以这样做:

std::runtime_error

但是,这不起作用。通常我会考虑这样做:

using std::runtime_error::std::runtime_error;

这确实有效,但是不确定这是解决方法还是唯一的实际解决方案。在使用Clang进行测试后,此方法有效:

using super = std::runtime_error;
using super::super;

但是我很好奇为什么,因为它不完全合格。为了在混合中使用扳手,我尝试通过引入多重继承来打破它:

using runtime_error::runtime_error;

现在namespace n { class runtime_error {}; } class foo : public std::runtime_error, public n::runtime_error { public: using runtime_error::runtime_error; }; 不再适用,因为它含糊不清。但是,using runtime_error::runtime_error别名仍然有效(因为您显式选择了要继承的基类),但是如果必须为每个继承的类型定义别名(例如super,{{ 1}})。

当完全限定名称语法(使用super1与用于指定成员的super2不明确时,从不同命名空间中的基类继承构造函数的正确方法是什么构造函数?

1 个答案:

答案 0 :(得分:1)

在类中尝试使用std::runtime_exception时出现编译错误的原因是,您需要提供构造函数的名称。 std::runtime_exception的构造函数的名称不是runtime_exception,而是using std::runtime_exception::runtime_exception; -构造函数的名称是非限定类型。因此,正确的符号应该是

std::runtime_exception

您的其他使用类型别名的解决方案也可以使用,尽管乍一看似乎令人困惑-为什么在使用类型别名确实为str.findall时可以使用类型别名-记住类型别名是有帮助的而不是文字替换,因此可以正常工作。

这两种方法都是有效的,选择哪种方法完全取决于您和您的代码。