假设我有以下课程:
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
不明确时,从不同命名空间中的基类继承构造函数的正确方法是什么构造函数?
答案 0 :(得分:1)
在类中尝试使用std::runtime_exception
时出现编译错误的原因是,您需要提供构造函数的名称。 std::runtime_exception
的构造函数的名称不是runtime_exception
,而是using std::runtime_exception::runtime_exception;
-构造函数的名称是非限定类型。因此,正确的符号应该是
std::runtime_exception
您的其他使用类型别名的解决方案也可以使用,尽管乍一看似乎令人困惑-为什么在使用类型别名确实为str.findall
时可以使用类型别名-记住类型别名是有帮助的而不是文字替换,因此可以正常工作。
这两种方法都是有效的,选择哪种方法完全取决于您和您的代码。