大括号之间的自定义类型初始化数组
Array of custom type initialization between braces
我正在努力并试图理解为什么以下代码不起作用。
我有 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
相关文章:
- 尝试了解C++指针和数据类型初始化
- C++ 基元类型初始化与对象初始化
- C++ 2D shared_ptr数组使用抽象多态类型初始化
- 如何根据构造函数参数使用超类类型初始化成员变量?
- 使用没有默认构造函数的类/类型初始化自定义容器
- Visual C 新类型初始化
- 如何创建一个编译时静态类类型,该类型初始化具有特定值的成员容器
- 使用初始化列表的 POD 类型初始化不起作用
- 大括号之间的自定义类型初始化数组
- std::数组类型初始化
- 错误:类型初始化无效
- 基本类型初始化C++
- 使用派生类类型初始化模板类的静态数组
- 部分默认使用内部类型初始化模板模板参数
- 类型初始化使用 OpenSsl.net 异常
- 存储可以使用不同派生类型初始化的基类型成员变量时,请避免使用new
- 向量和基元类型初始化
- 基元类型初始化的构造函数语法和赋值语法之间的差异
- 是否可以从大括号类型初始化中推断出元组的模板参数
- 可从任何序列类型初始化的c++类