我正在努力并试图理解为什么以下代码无效。
我有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不是?
答案 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