作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
再一次,我发现自己在与 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
有这么难的原因吗?
最佳答案
当然这应该有效,但听起来您正在执行以下一项或两项操作。
Q
模板参数或以其他方式依赖于它的类型(typedef 到它)。然后在std::list
之前放一个typename
,这样编译器就知道::iterator
是一个类型,可以正确的进行分析(它可以是静态值成员)。知道它是一种类型,编译器可以为模板定义提供更好的诊断,并且您需要使用 typename
来判断它是否是一种类型。 events
常量列表。然后使用 const_iterator
。 更新:显示的编译错误肯定表明第一点是正确的:Q
直接或间接依赖于模板参数,你必须把 typename
像这样:
typename std::list< Event<Q> >::iterator it;
编译器认为它是非类型的,因此它需要在 ::iterator
后面加上一些运算符或分号(例如乘法)。输入 typename
让它知道它命名了一个类型。
更新:参见Template FAQ对于类似的模板问题和解决方案。
关于C++:遍历泛型列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1571215/
我是一名优秀的程序员,十分优秀!