0

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

我有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 无效?

4

1 回答 1

1

为什么 PositionVertex 有效而 PositionColorVertex 无效?

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

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

在第二种情况下,您尝试PositionVertexColor使用包含两个元素的初始化列表来初始化 a,然后使用它来初始化 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
于 2012-12-04T16:15:28.477 回答