'begin'未在此范围内声明

时间:2016-04-17 20:23:54

标签: qt c++11 iterator

我有一个类似的课程(我只留下相关部分):

    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()调用,循环正常...我不明白为什么。为什么?以及如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

这就是基于范围的循环在C ++中的工作原理。特别是,在范围表达式中,参与者是类类型,在您的情况MyList中,为了使表达式合法,类类型必须具有已定义的成员beginend。< / p>

成员函数MyList::skip返回QList<T*>的迭代器。此迭代器类未定义任何beginend成员,并且编译器呈现此类型(即迭代器)不是基于范围的for循环表达式的合法参与者,而类类型{{ 1}}已定义成员MyListbegin呈现合法。

有关范围适用循环如何工作的更多信息,您可以找到here