for 循环中的 auto 导致“begin”未在此范围内声明

Alb*_*gni 0 c++ parameter-passing

我两天前开始学习 C++,我遇到的这个错误对我来说很模糊,我正在尝试执行以下操作

\n\n
int sumArray(const int arr)\n{\n  int sum = 0;\n  for (auto &n : arr) {\n    sum += n;\n  }\n  return sum;\n};\n\nint main () \n{\n  int numbers[] = {1, 2, 5, 10};\n  return sumArray(numbers);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这与“C++ 之旅”中的示例略有不同,我收到的错误是

\n\n

cpprepl.cpp: In function \xe2\x80\x98int sumArray(int)\xe2\x80\x99:\ncpprepl.cpp:4:18: error: \xe2\x80\x98begin\xe2\x80\x99 was not declared in this scope\n for (auto &n : arr) {\n ^~~\ncpprepl.cpp:4:18: error: \xe2\x80\x98end\xe2\x80\x99 was not declared in this scope\ncpprepl.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\ncpprepl.cpp:13:26: error: invalid conversion from \xe2\x80\x98int*\xe2\x80\x99 to \xe2\x80\x98int\xe2\x80\x99 [-fpermissive]\n return sumArray(numbers);\n ^\ncpprepl.cpp:1:5: note: initializing argument 1 of \xe2\x80\x98int sumArray(int)\xe2\x80\x99\n int sumArray(const int arr)\n ^~~~~~~~\n

\n\n

如果我做

\n\n
int main () {\n  int arr[] = {1, 2, 5, 10};\n\n  int sum = 0;\n  for (auto &n : arr) {\n    sum += n;\n  }\n  return sum;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

一切都很好,所以我怀疑我不理解指针以及 C++ 如何传递numberssumArray; 我已经看到了有关类似主题的多个问题,但我仍然不知道应该如何完成此操作。

\n

小智 5

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

为了允许在不使用标准库容器类型的情况下跟踪这一点,您可以通过引用传递数组:

int sumArray(const int (&arr)[4])
Run Code Online (Sandbox Code Playgroud)

要允许传入任意长度的数组,可以将其设为函数模板:

template <int N> int sumArray(const int (&arr)[N])
Run Code Online (Sandbox Code Playgroud)