汽车在此范围内未声明
我开始学习C++前两天这个错误,我得到的是模糊的我,我尝试做以下汽车在此范围内未声明
int sumArray(const int arr)
{
int sum = 0;
for (auto &n : arr) {
sum += n;
}
return sum;
};
int main()
{
int numbers[] = {1, 2, 5, 10};
return sumArray(numbers);
}
这是从 “A巡回赛C++的” 一个例子略有变化,我得到的错误是
cpprepl.cpp: In function ‘int sumArray(int)’: cpprepl.cpp:4:18: error: ‘begin’ was not declared in this scope for (auto &n : arr) { ^~~ cpprepl.cpp:4:18: error: ‘end’ was not declared in this scope cpprepl.cpp: In function ‘int main()’: cpprepl.cpp:13:26: error: invalid conversion from ‘int*’ to ‘int’ [-fpermissive] return sumArray(numbers); ^ cpprepl.cpp:1:5: note: initializing argument 1 of ‘int sumArray(int)’ int sumArray(const int arr) ^~~~~~~~
如果我做
int main() {
int arr[] = {1, 2, 5, 10};
int sum = 0;
for (auto &n : arr) {
sum += n;
}
return sum;
}
一切都很好,所以我怀疑我不了解指针和C++如何通过numbers
到sumArray
;我在类似的主题上看到了很多问题,但我仍然想不到应该怎么做。
C++不支持此类数组的foreach
式循环,因为它没有任何大小信息来构造基础迭代。正如评论中所建议的那样,最好只使用std::vector
。
如果大小的信息是可用的,例如在两个阵列和for
在相同的“范围”的情况下,威力工作。有关信息,请参阅this question。
我看到它在评论中被建议,但没有动机我不能真正接受是真的:D,谢谢你添加* why *。 –
@AlbertoZaccagni这就是我在第二段提到的情况。编译器知道'arr'有4个元素,因为这是你定义它的方式。所以它知道如何将'foreach'样式的循环翻译成一个正常的'for(i = 0; i
啊哈!知道了谢谢! –
如前所述,const int arr
因为它只是一个单一的int
,而不是一个数组,const int *arr
和const int arr[4]
意味着同样的事情,并宣布arr
因为没有信息有多少int
s的指向指针没有意义。错误信息只是令人困惑。
以允许使用标准库的容器类型保持跟踪这个而不,可以传递数组通过引用:
int sumArray(const int (&arr)[4])
为了允许任意长度的阵列被传入,则可以使之成为函数模板:
template <int N> int sumArray(const int (&arr)[N])
通过引用传递数组的使用不足。 – DeiDei
好吧,现在我明白了为什么我不应该使用原始数组,它感觉像很多工作,我不想引入一个新东西(函数模板,不管是什么:D),我可以只使用一个向量。谢谢! –
S /'INT sumArray(const int的ARR)'/'INT sumArray(const int的改编[4])' – user0042
@ user0042这样做,仍然获得约'begin'前两个错误, 'end'。 –
我建议你应该使用'std :: vector'而不是原始数组。 –
user0042