2017-09-23 118 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),我可以只使用一個向量。謝謝! –