大括号之间的自定义类型初始化数组

Array of custom type initialization between braces

本文关键字:类型 初始化 数组 自定义 之间      更新时间:2023-10-16

我正在努力并试图理解为什么以下代码不起作用。

我有 3 个类定义为:

class VertexType
{
public:
    VertexType(void) { };
    virtual ~VertexType() = 0;
};
class PositionColorVertex
    : public VertexType
{
public:
    PositionColorVertex(XMFLOAT3 _position, XMFLOAT4 _color)
    :Position(_position), Color(_color)
    {};
    ~PositionColorVertex() {};
    static const UINT size = 28;
    XMFLOAT3 Position;
    XMFLOAT4 Color;
};
class PositionVertex
    : public VertexType
{
public:
    PositionVertex(XMFLOAT3 _position)
    :Position(_position)
    {};
    ~PositionVertex() {};
    static const UINT size = 12;
    XMFLOAT3 Position;
};

阵列初始化适用于:

PositionVertex vertices[] = { XMFLOAT3(0,0,0) };

但是当我尝试初始化时:

PositionColorVertex vertices[] = {
{ XMFLOAT3(0,0,0), XMFLOAT4(0,0,0,1) } };

我收到错误 C2552 非聚合无法使用初始值设定项列表初始化。

为什么 PositionVertex 可以工作,而 PositionColorVertex 不能工作?

为什么 PositionVertex 可以工作,而 PositionColorVertex 不能工作?

因为在第一种情况下,您正在初始化一个数组,它是一个聚合:

PositionVertex vertices[] = { XMFLOAT3(0,0,0) };

在第二种情况下,您尝试使用包含两个元素的初始值设定项列表初始化PositionVertexColor然后使用该列表初始化 size-1 数组。第一部分仅适用于 C++11。您可以通过拆分以下内容来更好地可视化它:

PositionVertexColor vertices[] = { {XMFLOAT3(0,0,0), XMFLOAT4(0,0,0,1)} };

分为两部分:

PositionVertexColor pvc =  {XMFLOAT3(0,0,0), XMFLOAT4(0,0,0,1)}; // Error, non-aggregate.
PositionVertexColor vertices[] = { pvc }; // would be OK if first step had worked