2014-10-03 4 views
7

Quando provo a compilare il seguente codice nel gcc 4.8.2, ottengo il seguente errore:Gamma basati per-loop su matrice passata alla funzione principale non

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

Insieme con un gruppo, mentre altri da più in profondità nella libreria dei modelli.

#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; 
    } 
} 

Se ridefinire foo usare un indicizzato per ciclo, allora il codice compila e funziona come previsto. Inoltre, se sposto il ciclo di output basato su intervallo in main, ottengo anche il comportamento previsto.

Come passare l'array bar a foo in modo che sia in grado di eseguire su un loop basato su intervallo?

risposta

13

Con array decaying in un puntatore si perde un'importante informazione: la sua dimensione.

Con una serie riferimento l'intervallo ciclo basato così:

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; 
    } 
} 

o, in maniera generica (cioè senza specificare la dimensione dell'array nella firma funzione),

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

Try it out

1

Per un array di dimensioni fisse è possibile

  • Passare un array raw per riferimento.

  • Passare a std::array per riferimento.

  • Passare a std::vector per riferimento.

La scelta naturale (per una matrice di dimensione fissa) è std::array, cioè

#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); 
}