C++ 为什么在添加继承后复制列表初始化停止工作?

C++ 为什么在添加继承后复制列表初始化停止工作?,c++,inheritance,struct,initializer-list,C++,Inheritance,Struct,Initializer List,我已经用这种方式初始化了一个结构,很长一段时间没有出现任何问题: struct MyStruct { float firstArr[4]; float secondArr[4]; float thirdArr[4]; float fourthArr[4]; }; void Function() { std::vector<MyStruct> myArr; myArr.push_back // This works fine

我已经用这种方式初始化了一个结构,很长一段时间没有出现任何问题:

struct MyStruct
{
    float firstArr[4];
    float secondArr[4];
    float thirdArr[4];
    float fourthArr[4];
};

void Function()
{
    std::vector<MyStruct> myArr;

    myArr.push_back // This works fine
    ({
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 }
    });
}
struct MyStruct
{
浮动firstArr[4];
浮动二次arr[4];
第三方浮动[4];
浮动四舍五入[4];
};
空函数()
{
std::载体myArr;
myArr.push_back//这个很好用
({
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 },
{ 0, 0, 0, 0 }
});
}
当我开始从父级派生我的结构时,我再也不能这样做了

struct Parent
{
    // Nothing
};

struct MyStruct: Parent
{
    float firstArr[4];
    float secondArr[4];
    float thirdArr[4];
    float fourthArr[4];
};

void Function()
{
    std::vector<MyStruct> myArr;

    myArr.push_back // This gets compiler errors
    ({
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 }
    });
}
结构父级 { //没什么 }; 结构MyStruct:Parent { 浮动firstArr[4]; 浮动二次arr[4]; 第三方浮动[4]; 浮动四舍五入[4]; }; 空函数() { std::载体myArr; myArr.push\u back//这将获取编译器错误 ({ { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } }); } 第二个代码块在尝试以这种方式初始化时会出现编译器错误

是否有一个我可以声明的构造函数,它允许我这样初始化,并且仍然让我的结构从另一个派生?我不知道为什么它首先会给我一个错误,尤其是因为父结构是空的

我的整个项目都像这样推回它的“子”结构,所以有没有办法不包括我更改每个初始值设定项


稍后,我需要将
MyStruct
对象推回到
std::vector
上,在初始化方面可能会有完全不同的问题,但我甚至无法首先解决这个问题。

在您的第一个示例中,
MyStruct
是,因此,使用初始值设定项列表中的值对成员进行简单的复制初始化

在第二个示例中,
MyStruct
不再是一个聚合,因为它有一个基类,所以编译器会寻找构造函数;唯一可用的构造函数是隐式定义的默认构造函数(
MyStruct()
),因此出现错误

解决这个问题的一种方法是使用
std::array
和正确定义的构造函数

struct MyStruct: Parent
{
MyStruct(
  std::array<float, 4> const& first,
  std::array<float, 4> const& second,
  std::array<float, 4> const& third,
  std::array<float, 4> const& fourth)
   : firstArr{first}, secondArr{second}, thirdArr{third}, fourthArr{fourth} {}

  std::array<float, 4> firstArr;
  std::array<float, 4> secondArr;
  std::array<float, 4> thirdArr;
  std::array<float, 4> fourthArr;
};
struct MyStruct:Parent
{
我的结构(
std::数组常量&第一个,
标准::数组常量和秒,
标准::数组常量和第三个,
std::数组常量(第四个)
:firstArr{first},secondArr{second},thirdArr{third},fourthArr{fourth}
std::数组firstArr;
std::数组secondArr;
std::数组thirdArr;
std::数组fourthArr;
};

对于第二个问题,正如@FredLarson指出的,您将有一个
MyStruct
s推到
std::vector
,您需要重新考虑您的设计。

在第一个示例中,
MyStruct
是一个,因此使用初始值设定项列表中的值复制初始化成员

在第二个示例中,
MyStruct
不再是一个聚合,因为它有一个基类,所以编译器会寻找构造函数;唯一可用的构造函数是隐式定义的默认构造函数(
MyStruct()
),因此出现错误

解决这个问题的一种方法是使用
std::array
和正确定义的构造函数

struct MyStruct: Parent
{
MyStruct(
  std::array<float, 4> const& first,
  std::array<float, 4> const& second,
  std::array<float, 4> const& third,
  std::array<float, 4> const& fourth)
   : firstArr{first}, secondArr{second}, thirdArr{third}, fourthArr{fourth} {}

  std::array<float, 4> firstArr;
  std::array<float, 4> secondArr;
  std::array<float, 4> thirdArr;
  std::array<float, 4> fourthArr;
};
struct MyStruct:Parent
{
我的结构(
std::数组常量&第一个,
标准::数组常量和秒,
标准::数组常量和第三个,
std::数组常量(第四个)
:firstArr{first},secondArr{second},thirdArr{third},fourthArr{fourth}
std::数组firstArr;
std::数组secondArr;
std::数组thirdArr;
std::数组fourthArr;
};
对于第二个问题,正如@Fredrarson指出的,您将有一个
MyStruct
s推到
std::vector
,您需要重新考虑您的设计。

稍后您将遇到这个问题。您必须在向量中使用指向
父对象的指针(最好是智能指针),才能使其正常工作。稍后您将遇到此问题。您必须在向量中使用指向父对象的指针(最好是智能指针),才能使其正常工作。