c++ - 在结构 T 中存储 T 的数组时出现不完整的类型错误
问题描述
为什么允许这样做:
// 1
struct S {
std::vector<S> v;
};
// 2
struct T {
T* ptr;
};
这不是:
// 3
struct X {
X arr[];
};
这是第三个示例(clang-1001.0.46.3
编译器)的错误:
sample.cpp:9:4: error: field has incomplete type 'X'
X arr[];
^
sample.cpp:8:8: note: definition of 'X' is not complete until the closing '}'
struct X {
^
我理解为什么在结构中不允许使用固定大小的数组的原因,那是因为sizeof(T) = sizeof(T)*array_size + size_of_other_members
,顺便说一句,它可以用 编译std::vector<T>
,但不能用T[]
.
解决方案
对于要定义的变量,编译器需要知道变量的大小。
在第一种情况下,您拥有的是指针S
(请记住,std::vector
动态分配堆的内存,因此只需要一个指针),这没关系,因为编译器知道指针的大小。
在第二种情况下,您使用X
的类型(结构)尚未完全定义,因此编译器还不知道其大小X
。此外,在 C++ 中,您不能拥有“空”数组,所有数组都必须具有编译时固定大小。
推荐阅读
- android - 如何添加listview的所有价格并在底部的textview中显示?
- prestashop - 如何在 Prestashop 1.7 中删除 HTML 属性 `pattern`,*classes/form/CustomerLoginFormatter.php*
- android - 如何在 Android 中修改系统按键事件的行为
- python - 为不同的记录器设置不同的文件名
- python - mongoengine 可以在 python 中运行原始查询吗?
- java - 理解 java Stream.limit() 操作
- javascript - Angular 7 中的访问函数
- angular - Ngx Datatable 显示一行条目
- c# - 验证 SSL 证书
- hibernate - 如何在sql过程和hibernate中处理数据加密