2

このコードが機能しないのはなぜですか?

私が得ているエラーは

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() のベクトル パラメータがよくわかりません。なぜ必要なのですか? それらは既にメンバー関数であるため、パラメーターとして「this」が必要です。私はこのコードを書きましたが、関数は本から取られています (彼らは友達ですか??)

4

2 に答える 2

6

Vector::begin()and Vector::end() (パラメータなし)が必要です。また、返された値はイテレータとして機能する必要があります。

 

これは、範囲ベースのループの同様の可能な実装である可能性があります。

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

したがって:

__range の型が begin または end メンバー関数のいずれかまたは両方を持つクラス型である場合、 begin_expr は__range.begin()であり、 end_expr は__range.end()です。1

 

したがって、次のようになります。

T* begin()
{
    return elem;
}

T* end()
{
    return elem + sz;
}
于 2013-07-06T14:07:04.073 に答える
1

次のようにする必要があります。

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

template<typename T> T* end()
{
    return begin() + size;
}
于 2013-07-06T14:28:51.863 に答える