C ++:迭代泛型类型的列表

时间:2009-10-15 09:21:01

标签: c++ object iterator generics

然而,我又发现自己在努力学习C ++语法。

我正在尝试迭代通用对象列表。那就是我有一个班级的对象 Event<Q>,塞满了std::list<Event<Q> >

所以我试图在列表上得到一个迭代器并直观地认为

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

应该解决问题。但是,我不断收到这些错误:

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

有这么难的原因吗?

3 个答案:

答案 0 :(得分:8)

当然这应该有用,但听起来你要么有一个或两个以下的行动。

  • 拥有Q模板参数或以某种方式依赖于它的类型(typedef to it)。然后在typename之前放置std::list,以便编译器知道::iterator是一种类型并且可以正确地进行分析(它可以是静态值成员)。知道它是一种类型,编译器可以为模板定义生成更好的诊断,并且您需要使用typename来判断它是否是一种类型。
  • 拥有events个const列表。然后使用const_iterator

更新:显示的编译错误肯定表明第一个点为真:Q直接或间接取决于模板参数,您必须将typename放入这样:

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

编译器认为它是非类型的,因此它需要::iterator后面的一些运算符或分号(比如乘法)。放typename使其知道它命名的类型。

更新:有关类似的模板问题和解决方案,请参阅Template FAQ

答案 1 :(得分:0)

在你的样本中,什么是S?

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

你可以尝试在那里放一个原生类型吗?

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

或者进一步简化它?

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

答案 2 :(得分:0)

您是否已导入std命名空间?迭代器声明应该是:

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