首页 > 解决方案 > 在结构 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[].

标签: c++arraysvector

解决方案


对于要定义的变量,编译器需要知道变量的大小。

在第一种情况下,您拥有的是指针S(请记住,std::vector动态分配堆的内存,因此只需要一个指针),这没关系,因为编译器知道指针的大小。

在第二种情况下,您使用X的类型(结构)尚未完全定义,因此编译器还不知道其大小X。此外,在 C++ 中,您不能拥有“空”数组,所有数组都必须具有编译时固定大小。


推荐阅读