0

私はベクトルを実装しています(アロケータクラスを使用)。

explicit vector() : Capacity(0), Size(0) // first constructor
{
    buffer = Free = End;
}
explicit vector(size_t sz, const T& initial = T()) // second constructor 
{
    Capacity = sz;
    Size = sz;
    buffer = alloc.allocate(sz);
    for(size_t i = 0; i < sz; i++)
    {
        alloc.construct(buffer+i, initial);
    }
}
template<typename Iterator>
vector(Iterator beg, Iterator lst) // third constructor
{
    std::ptrdiff_t sz(lst - beg);
    buffer = alloc.allocate(sz);
    Iterator index(beg);

    for(size_t i = 0; i < sz; i++)
    {
        alloc.construct(buffer+i, *index++);
    }
    Size = sz;
    Capacity = sz;
}
vector(const vector<T> &rhs)
{
    *this = vector<T>(rhs.begin(), rhs.end());
}

/* .... */

int main()
{
    vector<int> vec1(10, 5);
    vector<int> vec2(vec1.begin(), vec1.end());
    /* .... */
}

これが私が定義したコンストラクターです。3番目のコンストラクターを使用すると、次のエラーメッセージが表示されます。

test.cpp:11:41: error: invalid conversion from ‘vector<int>::iterator {aka int*}’ to ‘long unsigned int’ [-fpermissive]

どちらも2つの引数があるため、コンパイラーは2番目のコンストラクターと3番目のコンストラクターを混同しているという結論に達しました。私に何ができる?

4

1 に答える 1

1

標準ベクトルiteratorは、それ自体に特別なクラスを持たせることで解決し、それを引数として使用します。これは、同じ数の引数があっても、引数の型が異なることを意味します。

于 2012-04-19T14:07:39.537 に答える