C++ 虚拟基类的构造函数参数

C++ 虚拟基类的构造函数参数,c++,constructor,multiple-inheritance,virtual-inheritance,inherited-constructors,C++,Constructor,Multiple Inheritance,Virtual Inheritance,Inherited Constructors,考虑以下代码: class A { int i; public: A(int index) : i(index) {} int get() { return i; } }; class B : virtual public A { public: using A::A; }; class C : virtual public A { public: using A::A; }; class D : public B, public C { public: D(int

考虑以下代码:

class A {
  int i;
public:
  A(int index) : i(index) {}
  int get() { return i; }
};

class B : virtual public A {
public:
  using A::A;
};

class C : virtual public A {
public:
  using A::A;
};

class D : public B, public C {
public:
  D(int i) : A(i), B(i), C(i) {}
};

int main() {
  D d(1);
  return 0;
}
虽然clang 3.7接受上述内容,但带有
-std=c++11
的gcc 4.8对此代码表示不满:

构造函数“D::D(int)”中的
:
20:29:错误:使用已删除的函数“B::B(int)”
D(inti):A(i),B(i),C(i){}
^
10:12:注意:“B::B(int)”被隐式删除,因为默认定义的格式不正确:
使用A::A;
^
10:12:错误:调用“A::A()”时没有匹配的函数
10:12:注:候选人为:
4:3:注:A::A(int)
A(int-index):i(index){}
^
4:3:注意:候选者需要1个参数,提供0个参数
1:7:注:常量表达式A::A(常量A&)
甲级{
^
1:7:注意:候选者需要1个参数,提供0个参数
1:7:注:constexpr A::A(A&&)
1:7:注意:候选者需要1个参数,提供0个参数
20:29:错误:使用已删除的函数“C::C(int)”
D(inti):A(i),B(i),C(i){}
^
15:12:注意:“C::C(int)”被隐式删除,因为默认定义的格式不正确:
使用A::A;
^
15:12:错误:调用“A::A()”时没有匹配的函数
15:12:注:候选人为:
4:3:注:A::A(int)
A(int-index):i(index){}
^
4:3:注意:候选者需要1个参数,提供0个参数
1:7:注:常量表达式A::A(常量A&)
甲级{
^
1:7:注意:候选者需要1个参数,提供0个参数
1:7:注:constexpr A::A(A&&)
1:7:注意:候选者需要1个参数,提供0个参数

我所写的代码是否符合标准?这是实现我所尝试的最好的方法吗,即通过多重继承树将构造函数参数传递给实际保存数据的公共基类?或者我可以以某种方式简化此过程或使其与gcc一起工作吗?我是否正确地假设继承虚拟数据的类基类通过多个父类间接地将始终必须直接显式地调用基类的构造函数?

这是GCC错误。您的代码应该像在Clang中那样编译。GCC过去在使用虚拟继承继承继承构造函数时遇到过问题

解决方法是手动编写转发构造函数

B类:虚拟公共A{
公众:
B(inti):A(i){}
};
C类:虚拟公共A{
公众:
C(inti):A(i){}
};

“我认为通过多个父类间接继承虚拟基类的类总是必须直接显式地调用基类的构造函数,这对吗?”是的,如果它是某个对象的最派生类。因为虚拟基类必须由最派生类初始化。代码用Visual C++ 2015编译好。我看不出它有什么错误,并且G++错误消息中提到的原因不成立。