浮子阵列抛出"incomplete type is not allowed"
Array of floats throws "incomplete type is not allowed"
我对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};
};
相关文章:
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- reference_wrapper导致"incomplete type is not allowed"
- 结构中的错误"Incomplete type is not allowed"
- "Called Object Type is Not a Function or Pointer" 与 typedef 和类
- 如何修复 eigen3 中的'non-type template argument is not a constant expression'?
- 警告的原因是什么:"when type is in parentheses, array cannot have dynamic size"?
- 在模板化类中使用嵌套嵌套类时的'dependent name is not a type'
- 这是什么意思:"member reference type 'Human *' is a pointer; did you mean to use '->'?"
- IS是[temp.res]/p8覆盖的[temp.dep.type]/p7
- vtkTypeTraits.h 错误:"Type long is not 4 or 8 bytes in size."
- 在 Ubuntu 14.04 上构建 AWS c++ 配置库时出现"return type is incomplete"错误
- 浮子阵列抛出"incomplete type is not allowed"
- 处理"Thrown exception type is not nothrow copy constructible"警告
- C++模板专用化:编译错误:"is not a type"
- 在编辑器中"Error: type name is not allowed"消息,但不在编译期间
- 模板错误:非类型 ".. [with T=T] is not a type name"
- 错误:移植项目时"incomplete type is not allowed"
- C++结构"Incomplete type is not allowed"
- "Incomplete Type Is Not Allowed"错误