【问题标题】:Passing a C array to a struct initializer in a vector brace initialization在向量大括号初始化中将 C 数组传递给结构初始化程序
【发布时间】:2016-01-30 14:34:55
【问题描述】:

首先,我见过this question

我很好奇为什么以下方法不起作用:

float vcolor[4]{color.getX(),color.getY(),color.getZ(),1.0f};
float v1[3]{from.getX(),from.getY(),from.getZ()};
float v2[3]{to.getX(),to.getY(),to.getZ()};
std::vector<Vertex> v={{v1,vcolor},{v2,vcolor}};

没有匹配的构造函数用于初始化 'std::vector'

但是直接传递元素可以正常工作(如另一个问题中所述):

std::vector<Vertex> v={
    {{from.getX(),from.getY(),from.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}},
    {{to.getX(),to.getY(),to.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}}};

不应该是前者也可以吗?

【问题讨论】:

  • {v1,vcolor},{v2,vcolor} 没有形成初始化列表。
  • @Lingxi 谢谢但是.. 它们在另一对大括号内,这将是一个初始化列表,不是吗?
  • 刚刚看了Vertex的定义。问题是你不能复制初始化数组。

标签: c++


【解决方案1】:

这里是一个简单的解释。您可以使用聚合初始化语法将数组初始化为float arr[4] = { 1.f, 2.f, 3.f, 4.f }。这就是Vertex v = { {1.f, 2.f, 3.f}, {1.f, 2.f, 3.f, 4.f} } 起作用的原因。你不能做的是从另一个数组复制初始化一个数组。所以

float arr[4] = { 1.f, 2.f, 3.f, 4.f };
float brr[4] = arr;

不起作用。因此,最终,在您的问题中,第一种形式不起作用。

【讨论】:

  • arr[4] 无论如何都不会命名第一个数组。它命名该数组的最后一个元素。你的最后一个例子应该是float brr[4] = arr;
  • @LightnessRacesinOrbit 我的错。感谢您的善意提及:-)
【解决方案2】:

让我们更详细地看看你在这里尝试做什么:

std::vector<Vertex> v={
    {{from.getX(),from.getY(),from.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}},
    {{to.getX(),to.getY(),to.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}}};

你尝试用两个元素初始化一个 Vector,这两个元素是用

初始化的
{{from.getX(),from.getY(),from.getZ()},
    {color.getX(),color.getY(),color.getZ(),1.0f}}

{{to.getX(),to.getY(),to.getZ()},
    {color.getX(),color.getY(),color.getZ(),1.0f}}

这些也是初始化列表,C++ 试图将其转换为顶点。 Sinze 它们包含两个元素,它们本身是包含 3(4) 个浮点数的初始化列表。 (至少我假设你的getX/Y/Z() 返回浮点数),一切都很好,它们用于初始化每个顶点内的数组。这有点等价于调用

Vertex{{from.getX(),from.getY(),from.getZ()},
        {color.getX(),color.getY(),color.getZ(),1.0f}};

float position[3]{from.getX(),from.getY(),from.getZ()};
float color[4]{color.getX(),color.getY(),color.getZ(),1.0f};

现在让我们看看你的第二个案例:

std::vector<Vertex> v={{v1,vcolor},{v2,vcolor}};

同样,每个包含初始化器列表都“映射”到一个顶点,调用如下:

Vertex{v1,vcolor}

但是 v1 和 vcolor 不是初始化列表,它们只是一个指向浮点的指针 (float*)

就像你做不到一样

float v3[3]{v1};

或更明显

float* f = new float;
float v[3]{f};

无法从float* 初始化数组

您可以尝试改用 std::arrays 并使用其基于迭代器的构造。或者您可以尝试为您的 Vertex 编写适当的构造函数。或者您可以将初始值设定项列表存储为初始值设定项列表,直到您实际形成顶点。无论哪种方式,通过多个步骤构建您的 Vertex 将需要更多的工作。

【讨论】:

  • 如果他的Vertex 有一个基于范围的构造函数,他可以为每个顶点使用{std::begin(vX), std::end(vX), std::begin(vcolor), std::end(vcolor)},即使是C 样式的数组。
猜你喜欢
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
相关资源
最近更新 更多