2014-10-03 44 views
7

當我嘗試編譯下面的代碼在GCC 4.8.2,我得到以下錯誤:一系列基於for循環的數組傳遞到非主要功能

test.cc: In function ‘void foo(int*)’: 
test.cc:15:16: error: no matching function for call to ‘begin(int*&)’ 
    for (int i : bar) { 
       ^

隨着別人的同時一堆從模板庫中的更深處。

#include <iostream> 
using namespace std; 

void foo(int*); 

int main() { 
    int bar[3] = {1,2,3}; 
    for (int i : bar) { 
    cout << i << endl; 
    } 
    foo(bar); 
} 

void foo(int* bar) { 
    for (int i : bar) { 
    cout << i << endl; 
    } 
} 

如果我重新定義foo使用索引for循環,則代碼編譯和行爲與預期。另外,如果我將基於範圍的輸出循環移動到main,我也會得到預期的行爲。

如何將數組bar傳遞給foo以使其能夠在其上執行基於範圍的for-loop?

回答

13

隨着array decaying成爲一個指針,你正在失去一個重要的信息:它的大小。

對於數組引用您的範圍基於循環工作的:

void foo(int (&bar)[3]); 

int main() { 
    int bar[3] = {1,2,3}; 
    for (int i : bar) { 
    cout << i << endl; 
    } 
    foo(bar); 
} 

void foo(int (&bar)[3]) { 
    for (int i : bar) { 
    cout << i << endl; 
    } 
} 

,或者在一種通用的方式(即,沒有在函數簽名指定數組的大小),

template <std::size_t array_size> 
void foo(int (&bar)[array_size]) { 
    for (int i : bar) { 
    cout << i << endl; 
    } 
} 

Try it out

1

對於固定大小的陣列,您可以

  • 通過引用傳遞原始數組。

  • 通過參照std::array

  • 通過參考std::vector

的自然選擇(對於固定大小的數組)是std::array,即

#include <iostream> 
#include <array> 
using namespace std; 

void foo(array<int, 3> const& bar) { 
    for (int i : bar) { 
    cout << i << endl; 
    } 
} 

int main() { 
    array<int,3> const bar = {1,2,3}; 
    for (int i : bar) { 
    cout << i << endl; 
    } 
    foo(bar); 
}