没有默认ctor的间接虚拟基会阻止子级拥有默认ctor,除非中间的每个类也有一个
我很抱歉这个晦涩的标题,不知道如何更好地表达它。
考虑以下继承层次结构:
struct A
{
A(int) {}
};
struct B : virtual A
{
B() : A(42) {}
};
struct C : B
{
C() : A(43) {}
};
它确实有效。现在假设我想创建一个可以在层次结构中间透明注入的模板,如下所示:
template <typename ...P>
struct Proxy : P...
{
// This constructor doesn't change anything. It was added
// to indicate that `Proxy` should only be used as a base.
protected:
Proxy() = default;
};
struct D : Proxy<B>
{
D() : A(44) {}
};
这给了我:error: call to implicitly-deleted default constructor of 'Proxy<B>'。
Run on gcc.godbolt.org
我明白发生了什么:Proxy不能有默认构造函数,因为它没有为 提供初始值设定项A,因此派生类不能 default-construct Proxy。
但是仔细想想这没有意义,因为即使我为Ain提供了一个初始值设定项Proxy,D也会忽略它并且必须提供它自己的初始值设定项。
我该如何解决这个限制?
代码中的所有内容都可以更改,但我更喜欢侵入性较小的更改。
在我实际的代码中,只有一个基类,导致这些问题,所以我做了两个不同的默认构造函数Proxy(有区别requires):一个无所事事,另(这是用来当任何P...从几乎继承A)传递一个虚拟参数到A::A(int)。
但我不喜欢这个解决方案,因为它不是通用的,所以我正在寻找更好的替代方案。
THE END
二维码