2014-10-03 22 views
7

Ben gcc 4.8.2 aşağıdaki kodu derlemeye çalıştığınızda, aşağıdaki hatayı alıyorum: başkalarının bir süre grup ile birlikteMenzil tabanlı For döngüsü olmayan ana işleve geçirilen dizisinde

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

şablon kitaplığından daha derinde.

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

ben döngü için dizinlenmiş kullanmak foo yeniden tanımlamak, sonra kod derler ve beklendiği gibi davranır. Ayrıca, aralık tabanlı çıktı döngüsünü main'a taşırsam, beklenen davranışı da alırım.

bar dizisini foo numaralı dizgeye nasıl bir aralık temelli for döngüsü yürütecek şekilde geçirebilirim?

cevap

13

Bir işaretçiye array decaying ile önemli bir bilgi parçasını kaybediyorsunuz: boyutu. Bir dizi

tabanlı döngü çalışır Aralığınızı başvuru: (fonksiyon imzası dizi boyutunu belirtmeden yani) genel durumlarda,

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

veya

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

Try it out

1

Sabit boyutlu bir dizi için

  • Referans ile bir ham dizi iletin.

  • std::array başvurusundan geçirebilirsiniz.

  • Referans olarak bir std::vector geçirin.

(sabit boyutlu dizisi için) doğal seçim, yani

#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); 
} 
std::array olduğu
İlgili konular