1

私のヘッダーファイルには

template <typename T>
class Vector {
   public:
       typedef T* iterator;
       typedef const T* const_iterator;

       Vector(const_iterator start, const_iterator end);

       // other stuff ...

}

そして、私が持っている.cppファイルに

template <typename T>
Vector< T >::Vector( const_iterator start, const_iterator end ) : theSize( 0 ), theCapacity( 1 )
{
    array = new T[ theCapacity ];
    typename Vector< T >::iterator itr = start; // this is line 29
    for( iterator itr = start; itr != end; itr++ ){
        push_back( *itr );
    }
}

しかし、コンパイラは私に言っています

Vector.cpp:29: error: invalid conversion from ‘const int*’ to ‘int*’

パラメータをconst_iteratorとして保持しながら、この問題を回避するにはどうすればよいですか?

注:それが役立つ場合は、開始と終了の間に別のベクターの要素を使用してベクターを作成しようとしています。

4

4 に答える 4

2

const_iteratorループで使用しない理由もここにはわかりません。また、push_back関数はイテレータではなく値を受け入れる必要があります。

したがって、関連する部分を次のように書き直します。

typename Vector< T >::const_iterator itr = start;
for(const_iterator itr = start; itr != end; itr++ ){
    push_back(*itr);
}
于 2013-02-14T23:03:33.950 に答える
0

Andy が言ったように、const イテレータが必要です。コンパイラが C++11 をサポートしている場合、コードは次のようになります。

template <typename T>
Vector< T >::Vector( const_iterator start, const_iterator end ) : 
theSize( 0 ), 
theCapacity( 1 )
{
    array = new T[ theCapacity ];
    for( auto itr = start; itr != end; itr++ ){
        push_back( *itr );
    }
}

私も尋ねなければなりません: あなたは本当にあなた自身のベクトルをハンドロールしたいですか? std::vector を使用しない正当な理由はありますか?

于 2013-02-15T00:16:01.773 に答える
0

push_back(*itr)の代わりに実行する必要がありpush_back(itr)ます。これで問題が解決します

于 2013-02-14T23:05:47.100 に答える