2013-07-25 12 views
5
#include <iostream> 
#include <iterator> 
using namespace std; 
void print(int ia[]) 
{ 
    int *p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

int main() 
{ 
    int ia[] = {1,2,3,4},i; 
    print(ia); 

    return 0; 
} 

Puntatore P sul primo elemento in ia. perché detto "Errore: nessuna funzione corrispondente per chiamata 'cominciare (int * &)' C++"! grazie :)errore: nessuna funzione di corrispondenza per la chiamata a 'begin (int * &)' C++

+2

@KarthikT: Non farebbe differenza. Chiamare 'begin' su un puntatore non funzionerà mai. –

+0

@ Eds. ah si .. perché non l'ho visto .. –

risposta

10

Perché dentro print(), la variabile ia è un puntatore, non un array. Non ha senso chiamare begin() su un puntatore.

+0

Ho capito! Grazie mille! :) – Aleeee

4

Si stanno utilizzando le funzioni libere begin e end su un puntatore, che non è consentito.

Si può fare qualcosa di simile con C++ 11 del intializer_list

//g++ -std=c++0x test.cpp -o test 
#include <iostream> 
#include <iterator> 
using namespace std; 
void print(initializer_list<int> ia) 
{ 
    auto p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

int main() 
{ 
    print({1,2,3,4}); 
    return 0; 
} 
+1

Ti suggerirei anche di usare la gamma per. – soon

+0

Grazie! :) Questo è un buon modo! – Aleeee

+0

Com'è questo per quanto riguarda le prestazioni? – Jakobovski

2

Come altri hanno sottolineato, l'array sta decadendo a un puntatore. Il decadimento è artefatto storico da C. Per fare ciò che vuoi, passare l'array come riferimento e dedurre la dimensione dell'array:

template<size_t N> 
void print(int (&ia[N]) 
{ 
    int *p = begin(ia); 
    while(p != end(ia)) 
     cout<<*p++<<'\t'; 
} 

... 

print(ia); 
+0

Grazie! :) Sei un brav'uomo! – Aleeee

Problemi correlati