2009-10-15 24 views
5

Una vez más, me encuentro luchando con la sintaxis de C++.C++: iterar sobre una lista de un tipo genérico

Estoy tratando de iterar sobre una lista de objetos genéricos. Es decir, tengo objetos de una clase Event<Q>, metida en un std::list<Event<Q> >.

Así que estoy tratando de conseguir un iterador sobre la lista e intuitiva pensado que

std::list<Event<Q> >::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 

debería resolver el problema. Sin embargo, sigo recibiendo estos errores:

..\calendar.h:48: error: expected `;' before "it" 
..\calendar.h:49: error: `it' was not declared in this scope 

¿Hay alguna razón para que sea tan difícil?

+1

¿Puede ser más específico acerca de los errores que está obteniendo? –

+0

... y un poco más de código, tal vez. ¿Cómo se instancian 'events'? – peterchen

Respuesta

8

Claro, esto debería funcionar, pero parece que tienes uno o ambos en acción.

  • Tiene Q un parámetro de plantilla o un tipo que de alguna manera depende de él (typedef). Coloque typename antes de std::list, entonces, para que el compilador sepa que ::iterator es un tipo y puede continuar el análisis correctamente (podría ser un miembro de valor estático). Sabiendo que es un tipo, el compilador puede producir mejores diagnósticos para las definiciones de plantilla, y se le solicita que diga si es un tipo usando typename.
  • Tenga events una lista const. Use const_iterator luego.

actualización: El error de compilación se muestra sin duda indica que el primer punto es cierto: Q depende directa o indirectamente de un parámetro de plantilla, y hay que poner typename así:

typename std::list< Event<Q> >::iterator it; 

El el compilador cree que no es de tipo, por lo que requiere un operador o punto y coma detrás de ::iterator (como, una multiplicación). Ponga typename para hacerle saber que nombra un tipo en su lugar.

Actualización: Consulte Template FAQ para obtener problemas y soluciones de plantillas similares.

+0

Muchas gracias, eso lo resolvió.Hice: 'nombre de tipo std :: lista > :: iterador it' y mágicamente trabajado – Nubsis

+0

Vaya Me perdí la parte Evento <> alrededor Q xD Estamos encantados de que funciona :) –

+0

Su explicación fue muy lúcido y también resuelto mi problema :) Muchas gracias, Johannes! –

0

en su muestra, ¿qué es S?

list<Event<S> >::iterator it; // what is S 
for (it = events.begin(); it != events.end(); it++) { ... } 

¿puedes intentar ponerle un tipo nativo allí?

list<Event<int> >::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 

o simplificarlo aún más?

list<int>::iterator it; 
for (it = events.begin(); it != events.end(); it++) { ... } 
0

¿Tiene el espacio de nombre estándar importado? Si la declaración del iterador hubiera sido:

std::list<Event<S> >::iterator it; 
Cuestiones relacionadas