2013-07-06 77 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 '不應該包含在這裏;這些聲明已經在類模板中。 –