我仍然是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
}
};
答案 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};
};