2014-10-03 7 views
7

Kiedy próbuję skompilować następujący kod w gcc 4.8.2, pojawia się następujący błąd:zakres oparty na pętli na tablicy przekazany do funkcji spoza głównego

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

Wraz z grupą innych while z głębiej w bibliotece szablonów.

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

Jeśli ponownie zdefiniować foo użyć indeksowany pętli, to kod kompiluje i zachowuje się w oczekiwany sposób. Ponadto, jeśli przestawię pętlę wyjściową na podstawie zakresu do main, otrzymam oczekiwane zachowanie.

Jak przekazać tablicę bar do foo w taki sposób, aby była w stanie wykonać pętlę for na bazie zakresu?

Odpowiedz

13

Po wprowadzeniu array decaying do wskaźnika tracisz jedną ważną informację: jej rozmiar.

z tablicą odwołać swój zakres pętli oparty działa:

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

lub w sposób ogólny (czyli bez określenia rozmiaru tablicy w podpisie funkcji),

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

Try it out

1

Dla tablicy o stałym rozmiarze można:

  • Prześlij surową tablicę przez odniesienie.

  • Przekaż std::array przez odniesienie.

  • Przekaż std::vector przez odniesienie.

naturalny wybór (na macierzy stałego rozmiaru) jest std::array tj

#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); 
} 
Powiązane problemy