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

时间:2012-12-04 16:12:32

标签: c++ arrays

我正在努力并试图理解为什么以下代码无效。

我有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不是?

1 个答案:

答案 0 :(得分:1)

  

为什么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