在数组上调用长度时,表达式必须具有类类型
Expression must have class type when calling length on an array
我正在用C++编写一个不相交的集合类,但不断收到此错误:
表达式必须具有类类型
在这一行
for (int i = 0; i < array.length; i++) {
我的代码如下所示:
class DisjointSet{
private:
int *array;
int size;
public:
void make_set(int elements){
array = new int[elements];
for (int i = 0; i < array.length; i++) {
array[i] = i;
size += 1;
}
}
当我尝试在for
循环中array.length
时会出现错误。我尝试改用->
运算符,但我不确定为什么这是一个问题......
您正在尝试在指针上调用成员.length
,但指针没有成员或函数。
您应该改用std::vector
,它确实知道它的大小
#include <vector>
class DisjointSet{
private:
std::vector<int> array;
public:
void make_set(int elements)
{
array.clear(); // clear elements
for (int i = 0; i < elements; ++i)
{
array.push_back(i);
}
}
};
现在你不再需要维护size
,因为std::vector
为你这样做(std::vector::size
(,你不再需要担心手动内存管理,当你多次调用make_set
时,你不会有任何泄漏。
这一行中的确切问题:
for (int i = 0; i < array.length; i++) {
在array.length
.如果括号后length
array.length
,则需要有空对。由于您没有那对括号,因此编译器认为array
是以length
作为其成员的类的对象。这就是为什么编译器为您提供:
表达式必须具有类类型
此外,最好在与计数器i
进行比较时使用变量elements
而不是array.length()
。
因此,更好的解决方案是使用:
for (int i = 0; i < elements; i++)
编辑:只是一些建议,使用std::vector
库而不是指针是一个更好的主意。它使您的生活更加轻松。
此外,您忘记初始化类DisjointSet
的字段size
。通过增加 for 循环中的size
,您会导致未定义的行为。
相关文章:
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 表观调用前面的表达式必须具有指向 func 类型的指针
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- 表达式必须具有类类型 vs.
- 错误:表达式必须具有算术、无作用域枚举或带有运算符重载的指针类型
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何确定涉及 C++ 中除法的算术表达式的数据类型
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 带有数组类型表达式的错误分配
- 表示函数参数的元组的类型表达式
- 如何确定撤销类型表达式的更大类型
- c++ 11中有新的函数类型表达式格式吗?