然而,我又发现自己在努力学习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
有这么难的原因吗?
答案 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;