recorrer que programacion para listas libreria iteradores iterador contenedoras clases c++ templates stl vector iterator

programacion - que es un iterador c++



Pregunta sobre iterador vectorial en funciones de plantilla (5)

Estoy tratando de aprender la biblioteca de STL y tengo un problema extraño. Este código compila perfectamente:

void Show(vector<int> myvec) { vector<int>::iterator it; cout << "Vector contains:"; for( it = myvec.begin(); it < myvec.end(); it++) { cout << " " << *it; } cout << endl; }

mientras que este me da un mensaje de error en tiempo de compilación:

template <class T> void Show2(vector<T> myvec) { vector<T>::iterator it; cout << "Vector contains:"; for( it = myvec.begin(); it < myvec.end(); it++) { cout << " " << *it; } cout << endl; }

El error es:

$ g++ hello.cpp hello.cpp: In function ‘void Show2(std::vector<T, std::allocator<_Tp1> >)’: hello.cpp:19: error: expected ‘;’ before ‘it’ hello.cpp:21: error: ‘it’ was not declared in this scope

Parece un error muy simple, pero no pude encontrarlo.


Algunos compiladores tienen problemas para detectar qué es un nombre de miembro y qué es un nombre de tipo cuando están dentro de las plantillas. Intente escribir algo como esto en la primera línea del cuerpo de la función de su plantilla.

typename vector<T>::iterator it;


En primera instancia, el parámetro, aunque usa una plantilla, no es una plantilla, es una clase completamente definida ( vector<int> )

En el último caso, el parámetro es una plantilla en el tipo T y, por lo tanto, requiere un nombre de tipo


Necesitas decir typename vector<T>::iterator it .

En otra nota, estás pasando vector s por valor. Eso significa que todo el vector se copia en la llamada de función. const_iterator más const_iterator void Show(vector<T> const &myvec) y usar const_iterator .


Necesitas esto:

typename vector<T>::iterator it;

Esto le dice al compilador que el vector<T>::iterator debe tratarse como un tipo, algo que no puede asumir ya que iterator depende de lo que es T


Tal vez funcione usando typename vector<T>::iterator it; Su compilador no puede saber que hay un iterador de clase interna.