2015-03-04 18 views
7

Sto cercando di imparare C++, quindi ho scritto un breve programma che utilizza il nuovo C++ 11 per il ciclo, il che rende il compilatore un errore che non capisco. questo è il mio codice C++:nuovo C++ 11 per le cause del ciclo: "errore: 'begin' non è stato dichiarato in questo ambito"

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

e questo è del compilatore (g ++ -std = gnu ++ 11) di errore:

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

Come ricordo, i loop basati su intervalli non funzionano con gli array. ** Modifica ** OK, dovrebbero, vedere il mio commento qui sotto. – Biffen

+1

@Biffen: cosa ti fa pensare così? – bitmask

+0

@bitmask Er, sono andato a cercarlo adesso, e apparentemente * dovrebbe * funzionare, ma mi sembra di ricordare di avere lo stesso problema prima. Forse è una limitazione del compilatore. – Biffen

risposta

14

Gamma-based per i loop lavorare con gli array, ma non con puntatori. Il problema qui è che arrays è in realtà un puntatore e non un array.

Quando si dispone di un parametro di funzione dichiarato come matrice, viene regolato su un tipo di puntatore. Puoi visualizzarlo qui con il parametro float arrays[3][3]: Nel messaggio di errore del compilatore puoi vedere che il tipo di parametro attuale è un puntatore a un array float (*)[3], che non può essere utilizzato con un loop per cicli.

Se si passa la matrice per riferimento, invece (float (&arrays)[3][3]), non verrà regolato su un puntatore in questo modo e pertanto funzionerà con il ciclo basato su intervallo.

+2

@bitmask questo post non afferma che i puntatori sono array o viceversa –

+0

Lo standard per la modifica del tipo da matrice a puntatore nei parametri di funzione è * regolato *. –

+0

@ T.C. Grazie, modificato di conseguenza. – interjay

Problemi correlati