C++: iterating over a list of a generic type

c++, generics, iterator, object

Solution

Sure this should work, but it sounds like you either have one or both of the following in action.

- Have `Q` a template parameter or a type that somehow otherwise depend on it (typedef to it). Put a `typename` before `std::list` then, so that the compiler knows that `::iterator` is a type and can proceed analysis properly (it could be a static value member). Knowing it is a type, the compiler can produce better diagnostics for template definitions, and you are required to tell whether it is a type using `typename`.

- Have `events` a const list. Use `const_iterator` then.

Update: The shown compile error surely indicates that the first point is true: `Q` directly or indirectly depends on a template parameter, and you have to put `typename` like so:

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

The compiler believes you that it is a non-type, and so it requires some operator or semicolon behind `::iterator` (like, a multiplication). Put `typename` to make it know it names a type instead.

Update: See the Template FAQ for similar template issues and solutions.

Problem

Yet again I find myself struggling with the C++ syntax. I'm trying to iterate over a list of generic objects. That is I have objects of a class `Event<Q>`, crammed into a `std::list<Event<Q> >`. So I'm trying to get an iterator over the list and intuitively thought that ``` std::list<Event<Q> >::iterator it; for (it = events.begin(); it != events.end(); it++) { ... } ``` should solve the problem. However, i keep getting these errors: ``` ..\calendar.h:48: error: expected `;' before "it" ..\calendar.h:49: error: `it' was not declared in this scope ``` Is there a reason for it being this difficult?

Original source