C++结构体:“不允许使用不完整类型”

5

有人知道为什么在我尝试在结构体内定义数组时会出现这个错误吗?

struct test{
    int idk[] = { 1,2,3 };
};

为什么数组idk是不完整类型或其他东西?

提前致谢。

附言: 我需要这个以便能够从测试结构中访问这些数组。


1
使用 int idk[3] = { 1,2,3 }; - Jakube
3
大多数情况下,数组的大小可以从初始化器中推断出来。但对于作为类成员的数组就不适用了。对于这些数组,您必须明确地指定其大小。 - Igor Tandetnik
1
与变量定义不同,非静态类数据成员的默认成员初始化器并不是该成员可以拥有的唯一初始化器,因此它不适用于推断数组大小。 - Kerrek SB
2个回答

5

当在本地作用域中声明变量时(例如在函数体中),您可以这样做,编译器不会抱怨,它会推断您的意思是一个由3个int元素组成的数组。

void someFunc()
{
    int idk[] = { 1,2,3 }; // Ok, so idk is in fact a int[3];
    // Do whatever work...
}

在类或结构体声明中,编译器不会为你推导出相同的事情,所以基本上你需要更加严格。有关完整原因,您可以在这里看到 (在成员变量中不能从初始化程序字符串推导出数组大小的原因是什么?),以及其他地方。因此,要使其正常工作,您需要这样做:
struct test 
{
    int idk[3] = { 1,2,3 };
};

关于人们为什么可能不喜欢这个问题,原因是这是一个平凡无奇的问题,而且在谷歌上进行任何搜索都可以得到答案。编译器本身会报错,只要查找错误,大多数情况下就能找到答案。
基本上,这种问题告诉社区你在提问之前没有做任何研究。
使用Visual Studio编译器时,会产生以下错误: 错误 C2997:'test :: idk':无法从类内初始化程序中推断出数组边界
这非常明确。
米克

我有Visual Studio但出现该错误的原因我并不清楚。我做了研究,但每次人们都在讨论结构体数组。不过还是谢谢你的解释。 - Hugius

1
 array bound cannot be deduced from an in-class initializer

将文本翻译成中文:

因此,将片段更改为

struct test{
int idk[3] = { 1,2,3 };

结果是成功编译。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接