一系列花车投掷"不允许不完整类型"

时间:2017-01-24 11:24:32

标签: c++ arrays

我仍然是C ++的新手,所以也许这是我在这里做的一个非常简单的错误。 我想在我的一个类中初始化一个私有float数组,就像这样。

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

但是firstVect用不完整类型的解释加下划线。 另一方面,float数组下面的两行有一个如下所示的int数组:

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

编译不会抱怨int数组,只会抱怨float数组。为什么呢?

我班级的完整代码:

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
   }
};

3 个答案:

答案 0 :(得分:2)

非静态数据成员必须具有完整类型,即如果它们是数组,则它们必须包含数组大小。大小不能从任何初始化器推断,因为初始化器是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的类型应该在这里?

答案 1 :(得分:2)

Compiling with a modern version of clang++让你的错误显而易见:

  

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

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

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

"编译不会抱怨int数组,只会抱怨float数组。为什么"

使用现代版的g ++进行编译也很明显:

  

错误:灵活的数组成员DataFilter::normalNumberOfDigits未在class DataFilter 结束

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

答案 2 :(得分:1)

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};
};