erreur de calcul de distance en c ++

#include  #include  #include  using namespace std; int square(int a){ return a*a; } struct Point{ int x,y; }; int distance (const Point& a,const Point& b){ int k=(int) sqrt((float)((ax-bx)*(ax-bx))+((ay-by)*(ay-by))); return k; } int main(){ vectora(10); for (int i=0;i>a[i].x>>a[i].y; } int s=0; int s1; int k=0; for (int i=1;i<10;i++){ s+=square(distance(a[0],a[i])); } for (int i=1;i<10;i++){ s1=0; for (int j=0;j<10;j++){ s1+=square(distance(a[i],a[j])); if (s1<s) { s=s1; k=i;} } } cout<<k<<"Points are:"; cout<<a[k].x; cout<<a[k].y; return 0; } 

J’ai le code suivant mais voici la liste des erreurs

 1>------ Build started: Project: distance, Configuration: Debug Win32 ------ 1> distance.cpp 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(373): error C2039: 'iterator_category' : is not a member of 'Point' 1> d:\c++_algorithms\distance\distance\distance.cpp(9) : see declaration of 'Point' 1> d:\c++_algorithms\distance\distance\distance.cpp(30) : see reference to class template instantiation 'std::iterator_traits' being comstackd 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(373): error C2146: syntax error : missing ';' before identifier 'iterator_category' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(373): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(373): error C2602: 'std::iterator_traits::iterator_category' is not a member of a base class of 'std::iterator_traits' 1> with 1> [ 1> _Iter=Point 1> ] 1> c:\program files\microsoft visual studio 10.0\vc\include\xutility(373) : see declaration of 'std::iterator_traits::iterator_category' 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(373): error C2868: 'std::iterator_traits::iterator_category' : illegal syntax for using-declaration; expected qualified-name 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(374): error C2039: 'value_type' : is not a member of 'Point' 1> d:\c++_algorithms\distance\distance\distance.cpp(9) : see declaration of 'Point' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(374): error C2146: syntax error : missing ';' before identifier 'value_type' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(374): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(374): error C2602: 'std::iterator_traits::value_type' is not a member of a base class of 'std::iterator_traits' 1> with 1> [ 1> _Iter=Point 1> ] 1> c:\program files\microsoft visual studio 10.0\vc\include\xutility(374) : see declaration of 'std::iterator_traits::value_type' 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(374): error C2868: 'std::iterator_traits::value_type' : illegal syntax for using-declaration; expected qualified-name 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(375): error C2039: 'difference_type' : is not a member of 'Point' 1> d:\c++_algorithms\distance\distance\distance.cpp(9) : see declaration of 'Point' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(375): error C2146: syntax error : missing ';' before identifier 'difference_type' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(375): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(375): error C2602: 'std::iterator_traits::difference_type' is not a member of a base class of 'std::iterator_traits' 1> with 1> [ 1> _Iter=Point 1> ] 1> c:\program files\microsoft visual studio 10.0\vc\include\xutility(375) : see declaration of 'std::iterator_traits::difference_type' 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(375): error C2868: 'std::iterator_traits::difference_type' : illegal syntax for using-declaration; expected qualified-name 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(377): error C2039: 'pointer' : is not a member of 'Point' 1> d:\c++_algorithms\distance\distance\distance.cpp(9) : see declaration of 'Point' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(377): error C2146: syntax error : missing ';' before identifier 'pointer' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(377): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(377): error C2602: 'std::iterator_traits::pointer' is not a member of a base class of 'std::iterator_traits' 1> with 1> [ 1> _Iter=Point 1> ] 1> c:\program files\microsoft visual studio 10.0\vc\include\xutility(377) : see declaration of 'std::iterator_traits::pointer' 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(377): error C2868: 'std::iterator_traits::pointer' : illegal syntax for using-declaration; expected qualified-name 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(378): error C2039: 'reference' : is not a member of 'Point' 1> d:\c++_algorithms\distance\distance\distance.cpp(9) : see declaration of 'Point' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(378): error C2146: syntax error : missing ';' before identifier 'reference' 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(378): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(378): error C2602: 'std::iterator_traits::reference' is not a member of a base class of 'std::iterator_traits' 1> with 1> [ 1> _Iter=Point 1> ] 1> c:\program files\microsoft visual studio 10.0\vc\include\xutility(378) : see declaration of 'std::iterator_traits::reference' 1> with 1> [ 1> _Iter=Point 1> ] 1>c:\program files\microsoft visual studio 10.0\vc\include\xutility(378): error C2868: 'std::iterator_traits::reference' : illegal syntax for using-declaration; expected qualified-name 1> with 1> [ 1> _Iter=Point 1> ] ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Ceci est causé en partie par votre utilisation de using namespace std; .

Il existe une fonction dans la bibliothèque standard, std::distance , utilisée pour calculer la distance entre deux iterators dans un conteneur. Cette fonction est sélectionnée pendant la résolution de surcharge au lieu de votre fonction de distance .

Si vous n’utilisez pas using namespace std; , vous n’aurez pas ce problème. Votre utilisation de using namespace std; apporte tous les noms de l’espace de noms std dans l’espace de noms global. Ceci est grave car il y a beaucoup de noms communs dans namespace std et cela peut causer des problèmes complexes lors de la recherche de nom, comme vous l’avez découvert ici.

En général, préférez ne pas utiliser l’ using namespace , surtout pas à la scope du fichier. Il est beaucoup plus facile et clair à long terme de qualifier chacun des noms que vous souhaitez utiliser.

@ James a raison de dire que se débarrasser de using namespace std fera disparaître ce problème. Mais ce n’est pas exactement le problème réel.

Le problème provient de la façon dont les noms sont résolus en C ++. C ++ utilise une approche très agressive pour résoudre les recherches de noms lors de la résolution des noms de fonctions libres si aucun membre de classe approprié n’a été trouvé. C’est ce qu’on appelle la recherche de nom dépendante de l’argument (ou ADL), parfois appelée recherche Koenig. Et en même temps, c’est l’une des choses qui rend le C ++ si puissant, mais aussi si meursortinger et déroutant.

Voici le problème de base, simplifié.

Vous appelez vector::operator[] qui renvoie un vector::reference ou un vector::const_reference . Vous prenez cette valeur de retour et appelez distance() non qualifié.

Etant donné que la distance n’existait pas dans la classe applicable, ADL entre en action, ce qui permet d’obtenir trop de noms correspondants .

ADL parcourt ensuite la liste des candidats et sélectionne “la meilleure correspondance”. Dans ce cas, la reference renvoyée par l’ operator[] correspond mieux au type attendu par std::distance que par votre distance , bien que les deux soient compatibles, donc std::distance est sélectionné.

Plusieurs façons de résoudre ce problème:

  1. N’utilisez pas l’ using namespace std . Au lieu de cela, using uniquement les morceaux que vous voulez
  2. Quantifiez explicitement la distance laquelle vous vous référez à l’aide de l’opérateur de résolution de l’oscilloscope: ::distance()
  3. Modifiez la distance pour prendre des pointeurs au lieu de const & . Cela désactive efficacement ADL .:

Exemple:

 int distance(const Point* a,const Point* b) s+=square(distance(&a[0],&a[1])); 

Ressources supplémentaires:

“Une proposition modeste: fixer l’ADL (révision 2)” par Herb Sutter