【问题标题】:C++: iterating over a list of a generic typeC++:迭代泛型类型列表
【发布时间】:2010-12-06 23:20:04
【问题描述】:

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

有这么难的原因吗?

【问题讨论】:

  • 您能否更具体地说明您遇到的错误?
  • ...也许还有更多的代码。 events 是如何实例化的?

标签: c++ object iterator generics


【解决方案1】:

当然这应该可行,但听起来您要么有以下一项或两项在行动。

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

更新:显示的编译错误肯定表明第一点是正确的:Q直接或间接依赖于模板参数,您必须像这样输入typename

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

编译器认为它是非类型,因此它需要在::iterator 后面加上一些运算符或分号(例如乘法)。输入typename 让它知道它命名了一个类型。

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

【讨论】:

  • 非常感谢,解决了。我做到了:typename std::list&lt;Event&lt;S &gt; &gt;::iterator it 它神奇地起作用了
  • 您的解释非常清晰,也解决了我的问题 :) 非常感谢,Johannes!
【解决方案2】:

在您的示例中,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++) { ... }

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2015-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多