添加继承后,为什么我的副本列表初始化停止工作?

nda*_*ton 1 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
    ({
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 },
        { 0, 0, 0, 0 }
    });
}
Run Code Online (Sandbox Code Playgroud)

当我开始从Parent派生我的结构时,我不再能够这样做了.

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 }
    });
}
Run Code Online (Sandbox Code Playgroud)

尝试初始化时,第二个代码块会出现编译器错误.

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

我的整个项目都像这样推回了它的"子"结构,所以有什么方法不包括我改变每一个初始化器吗?

后来我将需要将MyStruct对象推回到a std::vector<Parent>,这可能完全独立于初始化问题,但我似乎无法首先解决这个问题.

use*_*267 8

在第一个示例中,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;
};
Run Code Online (Sandbox Code Playgroud)

对于你的第二个问题,正如@FredLarson所指出的那样,你很难将时间推向MyStructa std::vector<Parent>,你需要重新考虑你的设计.