2015-03-04 26 views
7

Ben C++ öğrenmeye çalışıyorum, bu yüzden döngü için yeni C++ 11 kullanan kısa bir program yazdım, derleyicinin bana bir hata verdiğini anlamıyorum. benim C++ kodudur:yeni C++ 11 nedenleri: "hata: 'bu kapsamda' bildirildi 'bildirildi"

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

ve bu derleyici en (g ++ -std = antilop ++ 11) hata:

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

Geri çağırma olarak, döngülere göre aralık tabanlı dizilerle çalışmaz. ** Düzenle ** Tamam, aşağıda yorumumu görmeliler. – Biffen

+1

@Biffen: Sizi böyle hissettiren nedir? – bitmask

+0

@bitmask Er, şimdi bakmaya gittim, ve görünüşe göre * çalışmalı, ama daha önce aynı soruna sahip olduğumu hatırlıyorum. Belki de derleyicinin bir sınırlamasıdır. – Biffen

cevap

14

döngüler için sınıf bazlı dizilerle çalışmak, ancak ile işaretçileri. Buradaki konu, arrays'un aslında bir işaretçi değil, bir dizi olmasıdır.

Dizilim olarak bildirilen bir işlev parametreniz olduğunda, bir işaretçi türüne göre ayarlanır. Burada float arrays[3][3] parametresiyle görebilirsiniz: Derleyici hata mesajında, gerçek parametre türünün aralıklı temelli döngü ile kullanılamayacak bir dizi float (*)[3] işaretçisinin olduğunu görebilirsiniz.

Dizilimi yerine (float (&arrays)[3][3]) dizgeden geçirirseniz, bu şekilde bir işaretçi olarak ayarlanmaz ve bu nedenle döngü için aralık tabanlı olarak çalışır.

+2

@bitmask Bu gönderi, işaretçilerin diziler olduğunu ya da tam tersi olduğunu iddia etmez –

+0

İşlev parametrelerindeki dizi-gösterici tür değişikliği için standartlar * ayarlanır *. –

+0

@ T.C. Teşekkürler, buna göre düzenlenmiş. – interjay

İlgili konular