【问题标题】:Unexpected errors regarding structs and arrays关于结构和数组的意外错误
【发布时间】:2020-03-22 08:21:19
【问题描述】:

因此,我正在关注某个教程系列,并尝试利用这些知识对与该系列本身相似但又不同的东西进行自己的思考。在一个部分中,为了解决对我的问题范围不重要的某些不便,一种可能的解决方案是将某些数据块存储到结构的成员中,然后将该结构调用到稍后精确输出数据的函数上我们想要的方式 - 作为一个数组。

一切都很好,直到函数由于某种原因拒绝接受数组的值,声称数组参数中的信息过载(我稍后会指定错误),并且我是实体返回与函数的返回类型不匹配。

这是我的代码:


struct TriCoord
{
    float Position[3];
    int Label[2];
};

std::array<TriCoord, 3> Implement(float x, float y, float z, int j) //2
{
    float size = 1.0f;

    TriCoord f0;
    f0.Position = { x, y, z }; //1
    f0.Label = { j, 1 }; //1

    TriCoord f1;
    f1.Position = { x + 0.5, y + 0.5, z };
    f1.Label = { j, 2 };

    TriCoord f2;
    f2.Position = { x + 0.5, y, z };
    f2.Label = { j, 3 };

    return { f0, f1, f2 }; //2
};

int main()
{
    int X;
    float A[3] = Implement(3, 4, 5, 1); //3
    std::cout << A[0] << ", " << A[1] << ", " << A[2] << std::endl;
    std::cout << "Press Enter key to return" << std::endl;
    std::cin >> X;
    return 0;
}

我已将 cmets 专门定位到错误所在的位置。

1) 编译器说 f0 是“不可修改的左值”。我认为没有理由不应该这样做。在数组的第二个元素(在本例中为 y)的数组参数中,编译器说我正在添加“太多初始化值”。再次,没有意义。我指定 Position 数组有 3 个元素,并插入 3 个匹配类型(浮点)的元素。

这两个错误扩展到 f0.Label 以及其他 TriCoords。

2) 编译器说函数“返回不完整的类型'std::array'”。此外,在返回行中,“对象类型 'std::array' 的列表初始化是不允许的,因为类型不完整”。

从技术上讲,我返回的是一个 std 数组,其元素是 TriCoords,数量为 3,所以我再也看不到问题了。我确实通过将函数的返回类型更改为浮点数来解决这个问题,但是返回行会为第二个元素(在本例中为 f1)生成与问题 1 中相同的错误。

3) “聚合对象需要使用 '{...}' 进行初始化”我不知道这是什么意思。无论我为函数指定哪种返回类型,我都会收到此错误。

我必须强调,我和我正在关注的系列都使用 Visual Studios,并且在我关注的视频中没有出现此类错误。我什至逐行复制粘贴了整个视频的代码,但错误仍然存​​在,这让我得出结论,我的 Visual Studios 配置方式有问题,可能是由于版本差异(视频是今年上传,所以它不会在太旧的版本上运行)。我所有的依赖项也是正确的,并且存在于它们各自的基于项目的目录中,我已经仔细检查了这些。

最后,我上面使用的代码是一个单独的测试代码,我在一个新项目上重新编写,以尝试隔离错误。不用说,我在这两种情况下都遇到了同样的错误,表明我的原始项目的自定义标头和库本身没有任何问题。

【问题讨论】:

  • float a[3] 是一个数组,而不是std::array。使用auto a = 并编写operator&lt;&lt; 的重载以输出类TriCoord
  • 另外,关于第一点,赋值运算符不能应用于数组。你的类需要一个构造函数。
  • C++ 从 C 继承了它的数组功能(float a[3] 种类)。因此,它们是二等对象,而许多您期望工作的东西却没有。使用std::arraystd::vector 通常会更好。而且std::array 与您发现的传统数组不同。
  • std::cin &gt;&gt; X; 的意图是什么?这在main() 的末尾没有任何意义。
  • @harper 我敢打赌,这个“教程系列”教如何防止控制台窗口在程序结束后消失。

标签: c++ arrays struct


【解决方案1】:

1) 一旦它们被初始化,你就不能像这样分配到数组中。

int arr[3] = {1, 2, 3};    //valid

int arr2[3];
arr2 = {1, 2, 3};    //invalid

在您的情况下,您可以做的是:-

TriCoord f0;
f0.Position = { x, y, z }; 
f0.Label = { j, 1 }; 

写:-

float tempFloat[3] = { x, y, z }; 
int tempInt[2] = { j, 1 };
TriCoord f0;
for (int i = 0; i < 3; ++i)
    f0.Position[i] = tempFloat[i];
for (int i = 0; i < 2; ++i)
    f0.Label[i] = tempInt[i];

2) 解决 1 解决 2...

3) 您正在尝试将std::array&lt;TriCoord, 3&gt; 分配给一个浮点数组,这肯定是不可能的...

此时,我强烈建议您在任何地方都使用std::array

【讨论】:

  • 谢谢。从现在开始,我将尝试与 std::array 保持一致。我正在考虑完全放弃数组并使用 std::vectors 代替。如果我一开始就这样做,也许我可以完全避开这个问题。
  • @AlAbrar 如果你想要固定大小的小数组,你应该更喜欢 std::array 而不是 std::vectors...
猜你喜欢
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2014-06-12
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多