2013-01-14 3 views
18

Je vais avoir du mal avec le code suivant et ne peut pas sembler comprendre ce qui est malL'utilisation du vecteur en 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'erreur se trouve à appeler la distance de fonction.

/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

Que voulez-vous faire? –

+0

Je veux stocker des données dans une matrice de vecteurs (pour la taille dynamique), puis calculer la distance entre les points de données. –

Répondre

33

Vous essayez de remplacer la fonction std :: la distance, essayez de supprimer "using namespace std" et qualifiant cout et endl avec 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; 
} 

Le std::distance est utilisé pour compter le nombre d'éléments dans un conteneur dans une plage spécifiée. Vous pouvez en savoir plus à ce sujet here.

Ou vous pouvez renommer votre fonction de distance si vous voulez introduire l'espace de noms std:::

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

Cela rendra votre travail de code, mais il est recommandé de ne pas avoir des déclarations « à l'aide d'espace de noms » avant définitions. Lorsque vous écrivez votre code, vous devriez éviter la deuxième option, elle est montrée ici seulement comme une alternative pour votre exemple de code.

+2

Ou simplement renommer votre propre fonction de distance et supprimer le conflit avec' std :: distance'. – Mithrandir

+1

@Mithrandir C'est une solution rapide et bon marché. Je préfère que les affiches répondent. – Caesar

+6

@Mithrandir, non, "simplement" est "n'apporte pas un autre espace de noms dans l'espace de noms global", car * c'est pourquoi nous les avons *! – Griwes

4

Ne pas utiliser using namespace std lorsque vous créez votre propre fonction appelée distance, parce que votre appel à distance recherche std::distance et non votre fonction distance.

Vous pouvez aussi le faire:

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

On dirait qu'il a sa propre implémentation 'distance' – CAMOBAP

9

Que diriez-vous

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

(autres réponses suggèrent déjà la suppression de la directive using).

+3

C'est une bonne chose à savoir à propos de l'opérateur de résolution d'oscilloscope, mais je ne le mettrais pas dans le code de production, à moins que l'éviter causerait de gros, gros problèmes. Néanmoins, +1 pour des informations utiles. – dmckee

0

Vous pouvez également utiliser

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

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