Si votre code compile tout de même, c'est probablement parce que vous avez une using namespace std
quelque part. (Sinon vector
devrait être std::vector
.) C'est quelque chose que je déconseille et vous venez d'en fournir une bonne explication :
Par accident, votre appel est capté std::distance()
qui prend deux itérateurs et calcule la distance entre eux. Supprimez la directive using et préfixez tous les types de la bibliothèque standard par std::
et le compilateur vous dira que vous avez essayé de passer un vector <point>::iterator
où un point*
était nécessaire.
Pour obtenir un pointeur sur un objet vers lequel pointe un itérateur, il faut déréférencer l'itérateur - qui donne une référence à l'objet - et prendre l'adresse du résultat : &*ii
.
(Notez qu'un pointeur remplirait parfaitement toutes les conditions pour un std::vector
et certaines implémentations antérieures de la bibliothèque standard utilisaient en effet des pointeurs pour cela, ce qui permettait de traiter les itérateurs std::vector
itérateurs comme des pointeurs. Mais les implémentations modernes utilisent une classe d'itérateurs spéciale pour cela. Je suppose que la raison en est que l'utilisation d'une classe permet de surcharger les fonctions pour les pointeurs et les itérateurs. De plus, l'utilisation de pointeurs comme std::vector
itérateurs encourage le mélange des pointeurs et des itérateurs, ce qui empêchera le code de compiler lorsque vous changerez de conteneur).
Mais plutôt que de faire cela, je vous suggère de modifier votre fonction pour qu'elle prenne des références à la place (cf. cette réponse pour savoir pourquoi c'est une bonne idée de toute façon). :
float distance(const point& p1, const point& p2)
{
return sqrt((p1.x - p2.x)*(p1.x - p2.x) +
(p1.y - p2.y)*(p1.y - p2.y));
}
Notez que les points sont pris par const
références. Cela indique à l'appelant que la fonction ne modifiera pas les points qui lui sont transmis.
Alors vous pouvez l'appeler comme ceci : distance(*ii,*jj)
.
D'ailleurs, cette
typedef struct point {
float x;
float y;
} point;
est un C-isme inutile en C++. Il suffit de l'écrire
struct point {
float x;
float y;
};
Cela poserait des problèmes si cette struct
jamais été analysée par un compilateur C (le code devrait faire référence à struct point
alors, pas seulement point
), mais je suppose que std::vector
et autres seraient de toute façon un défi bien plus grand pour un compilateur C.