2013-01-14 14 views
18

Ho problemi con il seguente codice e non riesco a capire che cosa è sbagliatoUsando di vettore in C++

#include <iostream> 
#include <cmath> 
#include <vector> 

using namespace std; 

double distance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    cout<<distance(age[0],age[1]); 
    return 0; 
} 

L'errore sta a chiamare la funzione della distanza.

/usr/include/c++/4.6/bits/stl_iterator_base_types.h: In instantiation of ‘std::iterator_traits<int>’: 
test.cpp:18:30: instantiated from here 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:166:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:167:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:168:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:169:53: error: ‘int’ is not a class, struct, or union type 
/usr/include/c++/4.6/bits/stl_iterator_base_types.h:170:53: error: ‘int’ is not a class, struct, or union type 
+0

Che cosa vuoi fare? –

+0

Voglio memorizzare i dati in una matrice vettoriale (per dimensioni dinamiche), quindi calcolare la distanza tra i punti dati. –

risposta

33

Si sta tentando di ignorare la funzione std :: distanza, provare a rimuovere "using namespace std" e qualificazione cout e endl con std::

#include <iostream> 
#include <cmath> 
#include <vector> 


double distance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    std::vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    std::cout<< distance(age[0],age[1]); 
    return 0; 
} 

Il std::distance è utilizzato per contare il numero di elementi in un contenitore all'interno di un intervallo specificato. Potete trovare di più su di esso here.

Oppure si può rinominare la funzione di distanza se si vuole introdurre il std:: namespace:

#include <iostream> 
#include <cmath> 
#include <vector> 

using namespace std; 

double mydistance(int a, int b) 
{ 
    return fabs(a-b); 
} 

int main() 
{ 
    vector<int> age; 
    age.push_back(10); 
    age.push_back(15); 

    cout<<mydistance(age[0],age[1]); 
    return 0; 
} 

Questo renderà il vostro lavoro di codice, ma non è consigliabile avere "utilizzando namespace" dichiarazioni prima di definizioni. Quando scrivi il tuo codice, dovresti evitare la seconda opzione, qui viene mostrata solo come alternativa al tuo esempio di codice.

+2

O semplicemente rinomina la tua funzione di distanza e rimuovi lo scontro con' std :: distance'. – Mithrandir

+1

@Mithrandir Questa è una soluzione rapida ed economica. Preferisco la risposta dei poster. – Caesar

+6

@Mithrandir, no, "simply" è "non portare un altro spazio dei nomi nello spazio dei nomi globale", perché * è per questo che li abbiamo *! – Griwes

4

Non usare using namespace std quando si sta creando il proprio funzione chiamata distance, perché la vostra chiamata a distance è alla ricerca di std::distance e non la vostra funzione distance.

Si potrebbe anche fare questo:

namespace foo 
{ 
    double distance(int a, int b) 
    { 
    return fabs(a-b); 
    } 
} 

int main() 
{ 
    foo::distance(x,y); //now you're calling your own distance function. 
} 
+0

Sembra che abbia la sua implementazione 'distance' – CAMOBAP

9

Come su

cout<< ::distance(age[0],age[1]); 

(altre risposte già suggeriscono di rimuovere la direttiva using).

+3

Questa è una cosa utile da sapere sull'operatore di risoluzione dell'ambito, ma non lo inserirò nel codice di produzione a meno che evitarlo causerebbe problemi grandi e grossi. Nondimeno +1 per trivia utile. – dmckee

0

In alternativa, è possibile utilizzare

using foo::distance; // OR: 
using namespace foo; 

(distance)(x,y); // the (parens) prevent ADL