我已经用这种方式初始化了我的一个结构,很长一段时间没有出现任何问题:
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 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
对象到 std::vector<Parent>
,这可能在初始化方面有完全不同的问题,但我什至似乎无法首先解决这个问题。
最佳答案
在您的第一个示例中,MyStruct
是一个 aggregate ,所以成员只是使用初始化列表中的值进行复制初始化。
在你的第二个例子中,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;
};
对于你的第二个问题,正如@FredLarson 指出的那样,你将有一个 bad time推 MyStruct
s 到 std::vector<Parent>
,您需要重新考虑您的设计。
关于c++ - 为什么我的复制列表初始化在我添加继承后停止工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32162730/