C++:遍历通用类型的列表

6

我又一次发现自己在苦恼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

这么难真的有必要吗?

1
你能更具体地说明一下你遇到的错误吗? - Gareth Stockwell
还需要一点代码,也许。events是如何实例化的? - peterchen
3个回答

9
当然这应该可以工作,但听起来你可能正在执行以下一项或两项操作:
  • Q作为模板参数或某种其他方式依赖于它(typedef到它)。然后在std::list之前放置typename,以便编译器知道::iterator是一个类型并且可以正确分析(它可能是静态值成员)。知道它是一个类型,编译器可以为模板定义生成更好的诊断,并且您需要使用typename来说明它是一个类型。
  • events作为常量列表。那么请使用const_iterator
更新: 显示的编译错误肯定表明第一点是正确的: Q 直接或间接地依赖于一个模板参数,因此您必须像这样放置 typename
typename std::list< Event<Q> >::iterator it;

编译器认为它是一个非类型,因此需要在 ::iterator 后面添加一些运算符或分号(例如乘法)。加上 typename 以让编译器知道它是一个类型名称。 更新:请参阅模板 FAQ获取类似的模板问题和解决方案。

非常感谢,问题已解决。我使用了以下代码:typename std::list<Event<S > >::iterator it神奇地就可以工作了。 - mahju
你的解释非常清晰,也解决了我的问题 :) 非常感谢,Johannes! - Adrian Petrescu

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++) { ... }

0

你是否已经导入了std命名空间?迭代器声明应该是这样的吗:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接