如何在ranged for循环中使用begin()和end()

时间:2013-07-06 13:07:55

标签: c++ c++11

为什么这段代码不起作用?

我得到的错误是

T *Vector<T>::begin(Vector<T> &)' : expects 1 arguments - 0 provided

代码:

#include <iostream>
using namespace std;


template<typename T> class Vector
{
public:

    T* elem;
    int sz;

    Vector()
    {
        elem = new T[2];
        sz = 2;
    }

    template<typename T> T* begin(Vector<T>& x)
    {
        return &x[0];
    }

    template<typename T> T* end(Vector<T>& x)
    {
        return x.begin()+x.size();
    }

    unsigned int size()
    {
        return sz;
    }
};

int main()
{
    Vector<int> ea;

    for(auto& s: ea)
        // do something

    return 0;
}

我也不确定begin()和end()的vector参数,他们为什么需要它?它们已经是成员函数,因此它们应该将“this”作为参数。我写了这段代码,但函数是从一本书中获取的(他们是朋友吗?)

2 个答案:

答案 0 :(得分:6)

您需要Vector::begin()Vector::end() (不含参数)。并且返回的值应该用作迭代器。

这可能是基于范围的循环的类似可能实现:

auto && __range = range_expression;
for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin)
{
    range_declaration = *__begin;
    // loop_statement
} 

因此:

  

如果__range的类型是具有begin或an之一或两者的类类型   结束成员函数,然后begin_expr是 __ range.begin()和end_expr   是 __ range.end(); 1

所以,它应该是:

T* begin()
{
    return elem;
}

T* end()
{
    return elem + sz;
}

答案 1 :(得分:1)

应该是:

template<typename T> T* begin()
{
    return &elem[0];
}

template<typename T> T* end()
{
    return begin() + size;
}