我有一个类似的课程(我只留下相关部分):
template<class T>
class MyList
{
public:
// ....
typename QList<T*>::iterator begin()
{
return list.begin();
}
typename QList<T*>::iterator end()
{
return list.end();
}
typename QList<T*>::iterator skip(int n)
{
auto ite = list.begin();
while(n --> 0)
++ite;
return ite;
}
QList<T*> list;
};
当我去上课时:
MyList<Foo*> foo;
for(Foo* f : foo.skip(1)) {
我收到此错误:
'begin'未在此范围内声明
我删除skip()
调用,循环正常...我不明白为什么。为什么?以及如何解决这个问题?
答案 0 :(得分:4)
这就是基于范围的循环在C ++中的工作原理。特别是,在范围表达式中,参与者是类类型,在您的情况MyList
中,为了使表达式合法,类类型必须具有已定义的成员begin
和end
。< / p>
成员函数MyList::skip
返回QList<T*>
的迭代器。此迭代器类未定义任何begin
和end
成员,并且编译器呈现此类型(即迭代器)不是基于范围的for循环表达式的合法参与者,而类类型{{ 1}}已定义成员MyList
和begin
呈现合法。
有关范围适用循环如何工作的更多信息,您可以找到here。