2

プロジェクトを Visual Studio 2003 から 2005 に変換したばかりで、ほとんどは正常に「変換」されましたが、次の行から一連の STL エラーが発生します。

void SomeFn( std::vector<CSomeObject*>::iterator it,
std::vector<CSomeObject*>::iterator itBegin = NULL,
std::vector<CSomeObject*>::iterator itEnd = NULL );

Visual Studio のエラーは次のとおりです。

c:\<path>\Headerfile.h(20) : error C2440: 'default argument' : cannot convert from 'int' to 'std::_Vector_iterator<_Ty,_Alloc>'
        with
        [
            _Ty=CObject *,
            _Alloc=std::allocator<CObject *>
        ]
        No constructor could take the source type, or constructor overload resolution was ambiguous

そのコードに問題は見られず、VS 2003 では完全に機能しました。何かアイデアはありますか?

4

2 に答える 2

11

NULL は反復子として変換できないため、プログラムは正しくありません。これらのイテレータを初期化する方法がよくわかりません。コンテナー内にないことを保証されたイテレーターが必要な場合は、「有効」である必要がある場合は、デフォルト コンストラクターを使用できます。

typedef std::vector<CSomeObject*> myvector_t;
void SomeFn( myvector_t::iterator it,
             myvector_t::iterator itBegin = myvector_t::iterator(),
             myvector_t::iterator itEnd = myvector_t::iterator() );

ただし、そうすると、it、 、itBeginおよびitEndは意味のある方法で比較できなくなることに注意してください。特定のコンテナーから取得されたイテレーターのみが意味のある比較対象となります。itBegin最後に、およびにデフォルト値を使用しないことをお勧めしますitEnd。これらが本当に必要ない場合は、引数なしで別の関数を作成し、意味のあることを行います。すなわち:

typedef std::vector<CSomeObject*> myvector_t;
void SomeFn( myvector_t::iterator it,
             myvector_t::iterator itBegin,
             myvector_t::iterator itEnd );
void SomeFn( myvector_t::iterator it ); // No begin/end arguments

プログラムのもう 1 つの問題は、ベクトルを使用してポインターを格納することです。これは本当に危険です。最初に要素を削除せずに、ベクトルから要素を消去しないようにしてください。また、オブジェクトをコピーするアルゴリズムに問題がある場合もあります。ベクトルでスマート ポインターを使用することをお勧めします。

于 2008-11-12T11:42:10.677 に答える
2

2003年std::vector<T>::iteratorはちょうどT *です。2005年には、少なくともデバッグモードではクラスであるNULLため、その値に使用できません(NULLに解決され0ます)。

代わりに、デフォルトで構築されたイテレータを使用できます。

std::vector<CSomeObject*>::iterator itBegin = std::vector<CSomeObject*>::iterator()
于 2008-11-12T11:25:49.290 に答える