2010-07-01 11 views
5

Estoy tratando de compilar un iterador inverso, pero mis intentos de hacerlo crean un lío horrible. El ejemplo mínima del código es ...El iterador inverso no compilará

#include <iostream> 
#include <vector> 
#include <algorithm> 

class frag { 
    public: 
     void print (void) const; 
    private: 
     std::vector<int> a; 
}; 

void frag::print (void) const 
{ 
    for (std::vector<int>::reverse_iterator iter = a.begin(); 
     iter         != a.end(); 
     ++iter) { 
     std::cout << *iter << std::endl; 
    } 
} 

e intentar compilarlo produce el siguiente ...

In file included from /usr/include/c++/4.4/bits/stl_algobase.h:69, 
      from /usr/include/c++/4.4/bits/char_traits.h:41, 
      from /usr/include/c++/4.4/ios:41, 
      from /usr/include/c++/4.4/ostream:40, 
      from /usr/include/c++/4.4/iostream:40, 
      from frag.cpp:1: 
/usr/include/c++/4.4/bits/stl_iterator.h: In constructor ‘std::reverse_iterator<_Iterator>::reverse_iterator(const std::reverse_iterator<_Iter>&) [with _Iter = __gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >, _Iterator = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >]’: 
frag.cpp:14: instantiated from here 
/usr/include/c++/4.4/bits/stl_iterator.h:134: error: no matching function for call to ‘__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(__gnu_cxx::__normal_iterator<const int*, std::vector<int, std::allocator<int> > >)’ 
/usr/include/c++/4.4/bits/stl_iterator.h:686: note: candidates are: __gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator(const _Iterator&) [with _Iterator = int*, _Container = std::vector<int, std::allocator<int> >] 
/usr/include/c++/4.4/bits/stl_iterator.h:683: note:     __gnu_cxx::__normal_iterator<_Iterator, _Container>::__normal_iterator() [with _Iterator = int*, _Container = std::vector<int, std::allocator<int> >] 
/usr/include/c++/4.4/bits/stl_iterator.h:669: note:     __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >::__normal_iterator(const __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >&) 

Hubo una pregunta sobre este tema ayer, pero no creo que esto es lo mismo que no es una plantilla. Si un vector se declara de manera similar a nivel local, es bastante feliz. (g ++ en Ubuntu 10.4).

¿Alguien sabe qué debo hacer?

Respuesta

18

Es necesario utilizar const_reverse_iterator (print es una función de modo consta es const) y a.rbegin() y a.rend() en lugar de begin() y end().

+0

dang, un par de minutos antes :( – rubenvb

+0

@rubenvb: Aunque mi primer intento solo detectó un problema, editó frenéticamente para actualizar con el segundo número. –

+0

: D algunas preguntas parecen atraer a la multitud, ¿no? – rubenvb

2

Tiene que asignar un inverso iterador a un iterador inverso. Lo mismo con la comparación. iteradores inversa se pueden obtener utilizando métodos rbegin y rend:

for (std::vector<int>::reverse_iterator iter = a.rbegin(); iter != a.rend(); ++iter); 

Edit (para integridad) Como otros han dado cuenta, será necesario const_reverse_iterator aquí también.

+0

Gracias; en realidad no cometí ese error en el mundo real. programa, pero estaba probando muchas cosas en el ejemplo mínimo. –

3

Dos cosas que pueden causar un problema en su código:

  1. Su función print() se declara const, por lo que (probablemente necesita o debe) utilizan un const_reverse_iterator.

  2. Estás creando un reverse_iterator de un normal_iterator (std::vector<T>::begin())

+0

En el segundo punto, El problema no apunta al último elemento, sino que asigna y compara los tipos incompatibles 'normal_iterator' y' reverse_iterator' –

+0

corregidos por edit.Gracias – rubenvb

1

Las respuestas anteriores ya señalan que un const_reverse_iterator con rbegin/rend es necesario en este caso.

Además de eso, una buena práctica sería utilizar crbegin o crend (introducido en C++ 11) para indicar explícitamente que solicita la versión const del iterador ya que la función es print const.

Cuestiones relacionadas