[英]Incomplete type error when store an array of T in the struct 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 ++中,不能有“空”數組,所有數組都必須具有編譯時固定大小。
它被稱為Flexible array member
,它是用C編程語言的c99
標准引入的。
因此在C
中可能
struct IntContainer
{
size_t length;
int arr[];
};
但是C++
沒有靈活的數組成員。
有關更多信息,請參見以下靈活數組成員-Wikipedia
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.