2013-07-06 42 views
2

为什么不能使用此代码?如何在范围内使用begin()和end()for循环

我得到的错误是

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; 
} 

也是我不知道向量参数的开始()和end(),为什么他们需要它?他们已经是成员函数,所以他们应该有“this”作为参数。我写了这个代码,但功能是从一本书采取(他们是朋友?)

+0

'模板 T *()开始',也许? – 2013-07-06 13:09:08

+6

这本书在你手中,你为什么问我们?他们看起来像是免费的功能。 – Jon

+0

(或者更好,'T&begin()'?如果这是允许的话......) – 2013-07-06 13:09:29

回答

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_expr为__range.begin()和end_expr is __range.end(); 1

 

所以,它应该是:

T* begin() 
{ 
    return elem; 
} 

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

应该是:

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

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

'template '不应该包含在这里;这些声明已经在类模板中。 –