c++ - Error STL iterators std:: distance()
vector (2)
Tengo esos dos tiposdefs:
typedef std::vector<int> Container;
typedef std::vector<int>::const_iterator Iter;
En el problema que considero, realizo algunas operaciones en Container Input
, y después me gustaría calcular std::distance(Input.begin(),itTarget)
, donde itTarget
es del tipo Iter
. Pero obtengo este error del compilador de que no instance of function template "std::distance" matches the argument list
, y solo después de la conversión, es decir, std::distance(static_cast<Iter>(Input.begin()),itTarget)
todo funciona bien
Me pregunto, ¿por qué es así?
std :: distance es una función de plantilla, no puede aceptar diferentes parámetros. Necesitas usar:
std::distance(Input.cbegin(),itTarget);
^^
ver el enlace std :: vector :: cbegin
Input.begin()
devuelve un iterator
lugar de un const_iterator
, y su segundo argumento es un const_iterator
, por lo que los dos argumentos son básicamente de un tipo diferente. Puede usar cbegin()
si tiene acceso a las características de C ++ 11.
Una segunda forma de hacerlo: cada iterador es convertible en un const_iterator por asignación
std::vector<int> myVector(100);
std::vector<int>::iterator it = myVector.begin();
std::vector<int>::const_iterator cit = it;
Si tiene que empacar cosas en la llamada de función, podría usar algo de magia de lanzamiento:
std::distance( ((const Container*)&Input)->begin(), itTarget );
Si Input es const, el compilador se ve obligado a usar la versión const de begin (), que devuelve un const_iterator.