2017-09-23 97 views
0

我开始学习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++如何通过numberssumArray;我在类似的主题上看到了很多问题,但我仍然想不到应该怎么做。

+0

S /'INT sumArray(const int的ARR)'/'INT sumArray(const int的改编[4])' – user0042

+0

@ user0042这样做,仍然获得约'begin'前两个错误, 'end'。 –

+0

我建议你应该使用'std :: vector '而不是原始数组。 – user0042

回答

2

C++不支持此类数组的foreach式循环,因为它没有任何大小信息来构造基础迭代。正如评论中所建议的那样,最好只使用std::vector


如果大小的信息是可用的,例如在两个阵列和for在相同的“范围”的情况下,威力工作。有关信息,请参阅this question

+0

我看到它在评论中被建议,但没有动机我不能真正接受是真的:D,谢谢你添加* why *。 –

+1

@AlbertoZaccagni这就是我在第二段提到的情况。编译器知道'arr'有4个元素,因为这是你定义它的方式。所以它知道如何将'foreach'样式的循环翻译成一个正常的'for(i = 0; i <4; i ++)'循环。在第一种情况下,'sumArray'函数中没有这些信息,所以它不能做任何事情。当然,它可以看到并且看到你用一系列'4'元​​素来调用它,但是对于大型程序来说这会非常麻烦。如果您计划从二进制文件导出函数供以后使用,那么这是不可能的。 –

+0

啊哈!知道了谢谢! –

4

如前所述,const int arr因为它只是一个单一的int,而不是一个数组,const int *arrconst int arr[4]意味着同样的事情,并宣布arr因为没有信息有多少int s的指向指针没有意义。错误信息只是令人困惑。

以允许使用标准库的容器类型保持跟踪这个而不,可以传递数组通过引用:

int sumArray(const int (&arr)[4]) 

为了允许任意长度的阵列被传入,则可以使之成为函数模板:

template <int N> int sumArray(const int (&arr)[N]) 
+0

通过引用传递数组的使用不足。 – DeiDei

+0

好吧,现在我明白了为什么我不应该使用原始数组,它感觉像很多工作,我不想引入一个新东西(函数模板,不管是什么:D),我可以只使用一个向量。谢谢! –