2015-03-04 10 views
7

Próbuję się nauczyć C++, więc napisałem krótki program, który używa nowej pętli C++ 11 dla, co sprawia, że ​​kompilator daje mi błąd, którego nie rozumiem. to mój C++ Kod:nowe C++ 11 dla pętli powoduje: "error:" begin "nie zostało zadeklarowane w tym zakresie"

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

float legge_oraria_moto_accelerato(float a[3]){ 
    return a[2]*a[0] + 0.5*a[1]*a[0]*a[0]; 
} 
int corri(float (f)(float array[3]), float arrays[3][3]) 
    { for(auto i:arrays) cout << f(i) << '\n'; 
    return 0; 
} 

int main() 
{ 
return 0; 
} 

i to jest kompilator (g ++ -std = gnu ++ 11) błąd:

mezzo.cpp: In function ‘int corri(float (*)(float*), float (*)[3])’: 
mezzo.cpp:9:18: error: ‘begin’ was not declared in this scope 
    { for(auto i:arrays) cout << f(i) << '\n'; 
       ^
mezzo.cpp:9:18: note: suggested alternatives: 
In file included from /usr/include/c++/4.9/bits/basic_string.h:42:0, 
       from /usr/include/c++/4.9/string:52, 
       from /usr/include/c++/4.9/bits/locale_classes.h:40, 
       from /usr/include/c++/4.9/bits/ios_base.h:41, 
       from /usr/include/c++/4.9/ios:42, 
       from /usr/include/c++/4.9/ostream:38, 
       from /usr/include/c++/4.9/iostream:39, 
       from mezzo.cpp:1: 
/usr/include/c++/4.9/initializer_list:89:5: note: ‘std::begin’ 
    begin(initializer_list<_Tp> __ils) noexcept 
    ^
/usr/include/c++/4.9/initializer_list:89:5: note: ‘std::begin’ 
mezzo.cpp:9:18: error: ‘end’ was not declared in this scope 
    { for(auto i:arrays) cout << f(i) << '\n'; 
       ^
mezzo.cpp:9:18: note: suggested alternatives: 
In file included from /usr/include/c++/4.9/bits/basic_string.h:42:0, 
       from /usr/include/c++/4.9/string:52, 
       from /usr/include/c++/4.9/bits/locale_classes.h:40, 
       from /usr/include/c++/4.9/bits/ios_base.h:41, 
       from /usr/include/c++/4.9/ios:42, 
       from /usr/include/c++/4.9/ostream:38, 
       from /usr/include/c++/4.9/iostream:39, 
       from mezzo.cpp:1: 
/usr/include/c++/4.9/initializer_list:99:5: note: ‘std::end’ 
    end(initializer_list<_Tp> __ils) noexcept 
    ^
/usr/include/c++/4.9/initializer_list:99:5: note: ‘std::end’ 
+1

Jak pamiętam, pętle oparte na zasięgu nie działają z tablicami. ** Edytuj ** OK, powinni, zobacz mój komentarz poniżej. – Biffen

+1

@Biffen: Co sprawia, że ​​tak uważasz? – bitmask

+0

@bitmask Er, poszedłem to sprawdzić i najwyraźniej to * powinno * działać, ale wydaje mi się, że pamiętam, że miałem ten sam problem wcześniej. Być może jest to ograniczenie kompilatora. – Biffen

Odpowiedz

14

Zakres opartej na pętlach pracy z tablicami, ale nie z wskaźniki. Problem polega na tym, że arrays jest w rzeczywistości wskaźnikiem, a nie tablicą.

Gdy masz parametr funkcji, który jest zadeklarowany jako tablica, jest dostosowywany do typu wskaźnika. Możesz to zobaczyć tutaj z parametrem float arrays[3][3]: W komunikacie o błędzie kompilatora widać, że aktualny typ parametru jest wskaźnikiem do tablicy float (*)[3], której nie można użyć z pętlą for na odległość.

Jeśli przekażesz tablicę przez odniesienie (float (&arrays)[3][3]), to w ten sposób nie dostosujesz się do wskaźnika i dlatego będziesz pracował z pętlą opartą na zasięgu.

+2

@bitmask tego posta nie twierdzi, że wskaźniki są tablicami lub odwrotnie: –

+0

Standardowymi parametrami zmiany typu w tablicy na wskaźnik są * dostosowane *. –

+0

@ T.C. Dzięki, odpowiednio edytowane. – interjay

Powiązane problemy