繁体   English   中英

在向量括号初始化中将C数组传递给结构初始化器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM