浮子阵列抛出"incomplete type is not allowed"

Array of floats throws "incomplete type is not allowed"

本文关键字:type is not allowed incomplete 阵列      更新时间:2023-10-16

我对C++还很陌生,所以也许这是我在这里犯的一个非常简单的错误。我想在我的一个类中初始化一个私有浮点数组,就像这样。

float firstVect[] = {0.0f,0.0f,0.0f};

但首先Vect下划线了不完整类型的解释。另一方面,浮点数组下方的两行我有一个 int 数组,如下所示:

int normalNumberOfDigits[]= {0,0,0};

编译不抱怨 int 数组,而只抱怨浮点数组。为什么?

我的类的完整代码:

class DataFilter
{
public:
   int filterMovement(float vect3[3])
   {
       //TBD
   }
private:
   float firstVect[] = {0.0f,0.0f,0.0f};
   int initialized = 0;
   int normalNumberOfDigits[]= {0,0,0};
   int determinNumberOfDigits(float testValue)
   {
     //TBD
   }
};

使用现代版本的 clang++ 进行编译会使您的错误显而易见:

错误:无法从类内初始值设定项推断数组绑定

您需要在类初始化中显式指定数组的大小(如果要使用 C 样式数组):

class DataFilter
{
   // ...
   float firstVect[3] = {0.0f,0.0f,0.0f};
   int initialized = 0;
   int normalNumberOfDigits[3]= {0,0,0};
   // ...
};

"编译不抱怨 int 数组,只抱怨浮点数组。为什么?

使用现代版本的 g++ 进行编译也使这一点变得显而易见:

错误:灵活阵列成员DataFilter::normalNumberOfDigits不在class DataFilter末尾

当您声明一个没有显式大小的数组时,编译器会认为它是一个灵活的数组,这是一个仅限 C 的功能。它似乎在C++中被允许作为非标准的 g++ 扩展。

非静态数据成员必须具有完整类型,即如果它们是数组,它们必须包含数组大小。大小不能从任何初始值设定项推断出来,因为初始值设定项是 a) 可选的,b) 不是类定义的一部分,而是所有构造函数定义的隐式部分。

简单修复:

 float firstVect[3] = {0.0f,0.0f,0.0f};
 //             ^^^

为了澄清一下解释:具有默认成员初始值设定项的类定义,如下所示:

struct Foo
{
    int a[3] = {1, 2, 3};
};

在概念上

与:
struct Foo
{
    Foo();
    int a[3];
};
Foo::Foo() : a{1, 2, 3} {}

您现在看到初始值设定项实际上不是类定义的一部分,因此不能用于推断数组大小。

一个更极端的例子是:

struct Bar
{
    Bar(int) : a{1, 2, 3} {}
    Bar(float): a{1, 1} {}
    Bar() = default;
    int a[???] = {4, 4, 4, 4, 4};
};

这里应该是什么类型的Bar::a

Clang 报告了一个更清晰的错误:

fatal error: array bound cannot be deduced from an in-class initializer

您必须显式调整数组的大小:

class DataFilter
{
    // ...
private:
   float firstVect[3] = {0.0f,0.0f,0.0f};
   int normalNumberOfDigits[3]= {0,0,0};
};