2013-01-14 19 views
18

Mam problemy z następującego kodu i nie może się dowiedzieć, co jest nie takZastosowanie wektora w 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; 
} 

Błąd leży w odległości wywołanie funkcji.

/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

Co chcesz zrobić? –

+0

Chcę przechowywać dane w tablicy wektorów (dla rozmiaru dynamicznego), a następnie obliczyć odległość między punktami danych. –

Odpowiedz

33

Próbujesz zastąpić funkcję std :: dystans, spróbuj usunąć "using namespace std" i kwalifikującej cout i endl z 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; 
} 

std::distance jest służy do zliczania liczby elementów w pojemniku w określonym zakresie. Możesz znaleźć więcej informacji na ten temat here.

Można też zmienić nazwę funkcji na odległość, jeśli chcesz wprowadzić std:: nazw:

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

uczyni pracę kodu, ale nie zaleca się „używając nazw” deklaracji przed definicjami. Kiedy piszesz swój kod, powinieneś unikać drugiej opcji, pokazanej tutaj tylko jako alternatywa dla twojego przykładu kodu.

+2

Albo po prostu zmień nazwę swojej własnej funkcji odległości i usuń starcie z' std :: distance'. – Mithrandir

+1

@Mithrandir Jest to szybka i tania poprawka. Wolę odpowiedź na plakaty. – Caesar

+6

@Mithrandir, nie, "po prostu" to "nie wprowadzaj innego obszaru nazw do globalnej przestrzeni nazw", ponieważ * dlatego właśnie je mamy *! – Griwes

4

Nie używaj using namespace std podczas tworzenia własnych funkcji o nazwie distance, ponieważ wywołanie distance szuka std::distance a nie czynność distance.

Można też to zrobić:

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

Wygląda na to, że ma własną implementację 'distance' – CAMOBAP

9

Jak o

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

(inne odpowiedzi już sugerować usunięcie dyrektywę using).

+3

Warto wiedzieć o operatorze rozdzielczości, ale nie umieściłbym go w kodzie produkcyjnym, chyba że uniknięcie go spowodowałoby duże, duże problemy. Nie mniej jednak +1 za przydatne drobiazgi. – dmckee

0

Alternatywnie, można użyć

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

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