C++ 继承虚拟基类的构造函数

C++ 继承虚拟基类的构造函数,c++,c++11,gcc,g++,virtual-inheritance,C++,C++11,Gcc,G++,Virtual Inheritance,虚拟基类是在派生最多的类中初始化的,因此我猜想继承基类的构造函数也应该可以工作: struct base{ 基(int){} }; 派生结构:虚拟基{ 使用base::base; }; 导出d(0); 但是,这在GCC 5.2.0中无法编译,GCC 5.2.0尝试查找base::base(),但在Clang 3.6.2中运行良好。这是GCC中的错误吗?这是GCC错误 “[C++11]继承构造函数不能与虚拟继承一起正常工作” (又名: 隐式删除虚拟基中的“使用构造函数”: 根据58751说明:

虚拟基类是在派生最多的类中初始化的,因此我猜想继承基类的构造函数也应该可以工作:

struct base{
基(int){}
};
派生结构:虚拟基{
使用base::base;
};
导出d(0);
但是,这在GCC 5.2.0中无法编译,GCC 5.2.0尝试查找
base::base()
,但在Clang 3.6.2中运行良好。这是GCC中的错误吗?

这是GCC错误 “[C++11]继承构造函数不能与虚拟继承一起正常工作” (又名: 隐式删除虚拟基中的“使用构造函数”:

根据58751说明:

N2540文件中规定:

通常,为具有虚拟基的类继承构造函数定义将是格式错误的,除非虚拟基支持默认初始化,或者虚拟基是直接基,并命名为转发到的基。同样,所有数据成员和其他直接基必须支持默认初始化,或者任何使用继承的尝试ing构造函数将是格式错误的。注意:使用时格式错误,未声明

因此,委员会明确审议了虚拟基地的情况,因此应予以实施

从错误报告中借用的解决方法:

struct base {
    base() = default;  // <--- add this
    base(int) {}
};
struct base{

base()=default;//相关:当然,如果无法默认构造
base
,那么这仍然不起作用……因此,解决这一问题的唯一方法似乎是在所有派生类中手动重新定义构造函数。