[英]Passing a C array to a struct initializer in a vector brace initialization
首先,我已经看到了这个问题 。
我很好奇以下原因为何不起作用:
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}}};
前者也不可能吗?
这是一个简单的解释。 您可以使用聚合初始化语法将数组初始化为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;
不起作用。 因此,最终,在您的问题中,第一种形式不起作用。
让我们在这里更详细地了解您要做什么:
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 ++尝试将其转换为Vertex。 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}};
同样,每个containig初始化程序列表都被“映射”到一个顶点,从而发出如下调用:
Vertex{v1,vcolor}
但是v1和vcolor并不是初始化列表,它们只是一个指向float( float*
)的指针
就像你做不到的一样
float v3[3]{v1};
或更明显
float* f = new float;
float v[3]{f};
没有办法从float*
初始化数组float*
您可以尝试改用std :: arrays并使用其基于Iterator的构造。 或者,您可以尝试为您的顶点编写适当的构造函数。 或者,您可以将初始化程序列表存储为初始化程序列表,直到您真正形成顶点为止。 无论哪种方式,分多个步骤构造顶点都需要更多的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.