que su código se compila en absoluto es probablemente porque tiene un using namespace std
en alguna parte. (De lo contrario, vector
tendría que ser std::vector
) That's something I would advise against y acaba de proporcionar un buen caso por qué:
Por accidente, su llamada retoma std::distance()
, que toma dos iteradores y calcula la distancia entre ellos. Elimine la directiva de uso y prefija todos los tipos de biblioteca estándar con std::
y el compilador le dirá que intentó pasar un vector <point>::iterator
donde se requirió point*
.
Para obtener un puntero a un objeto al que apunta un iterador, debe eliminar la referencia del iterador, que proporciona una referencia al objeto, y tomar la dirección del resultado: &*ii
.
(Tenga en cuenta que un puntero cumpliría perfectamente todos los requisitos para un iterador std::vector
y algunas implementaciones anteriores de la biblioteca estándar utilizaban punteros para eso, lo que le permitía tratar los iteradores std::vector
como punteros. Pero las implementaciones modernas usan una clase de iterador especial para ese Supongo que la razón es que usar una clase permite funciones de sobrecarga para punteros e iteradores. Además, usar punteros como iteradores std::vector
alienta a mezclar punteros e iteradores, lo que evitará que el código compile cuando cambie su contenedor.)
Pero en lugar de hacer esto, le sugiero que cambie su función para que tome referencias en su lugar (vea this answer para saber por qué es una buena idea de todos modos):
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));
}
Tenga en cuenta que los puntos se toman por referencias const
. Esto indica a la persona que llama que la función no cambiará los puntos en que se pasa.
Entonces puede llamarlo así: distance(*ii,*jj)
.
En una nota lateral, esta
typedef struct point {
float x;
float y;
} point;
es un C-ISM innecesario en C++. Sólo deletrearlo
struct point {
float x;
float y;
};
que haría problemas si esta definición struct
vez hubo que analizar desde un compilador de C (el código tendría que referirse a struct point
entonces, no simplemente point
), pero supongo std::vector
y similares haría ser mucho más un desafío para un compilador de C de todos modos.
Esta respuesta es incorrecta. std :: distance puede ser recogido por ADL en un std :: iterator, por lo que puede formar parte del conjunto de candidatos independientemente de si se utiliza o no 'std'. – Puppy
@Puppy: Eso es cierto (y durante 2.5 años nadie lo notó), pero esto no es todo lo que dijo mi respuesta. Pasar puntos por 'const point & p1' también resolverá este problema. – sbi
@sbi: No, no resolverá el problema. Todavía será posible escribir erróneamente 'distance (ii, jj)' y obtener 'std :: distance'. –