c++ - 如何在范围 for 循环中使用 begin() 和 end()

标签 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”作为参数。这段代码是我写的,但是函数是从一本书上摘下来的(他们是 friend 吗??)

最佳答案

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

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

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

因此:

If __range's type is a class type with either or both a begin or an end member function, then begin_expr is __range.begin() and end_expr is __range.end(); 1

所以,应该是:

T* begin()
{
    return elem;
}

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

关于c++ - 如何在范围 for 循环中使用 begin() 和 end(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17503279/

相关文章:

java - C、C++ 和 Java 中的不同结果相同的表达式。为什么?

c++ - 使用右值引用重载模板化可变参数运算符

c++ - 变量的可访问性

c++ - 清除键盘缓冲区

c++ - 寻找对我的线程安全、无锁队列实现的批评

c++ - 在过渡到 C++11 期间管理外部库(例如 boost)

c++ - 为什么在调用的赋值析构函数中使用 in const 时,赋值是正确的

c++ - 在 C++ 中修改 std::unordered_map 元素的值

c++ - std::function 中的可变模板参数匹配

c++ - 模板模板参数的模板特化