2

このコードはVC6でファイルをコンパイルしますが、VS2008ではエラーが発生します。誰か教えてもらえますか?ポインタをNULL(0のtypedef)と比較できなくなったためだと思います。その場合、VC9でこの比較を行うにはどうすればよいですか?

for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin(); iT < attrLst.end(); iT++)
        { 
            if ( (iT != NULL) && (*iT != NULL) ) //Error: C2678
            {
//code
}
}

エラーC2678:バイナリ'!=':タイプ'std :: _ Vector_iterator <_Ty、_Alloc>'の左側のオペランドをとる演算子が見つかりません(または受け入れ可能な変換がありません)

4

4 に答える 4

8

'std :: vector :: iterator'の型は必ずしもポインタ型ではないため、NULLと比較することはできません。

古いコンパイラでは、たまたまポインタであったため、コードがコンパイルされました。しかし、あなたは幸運に恵まれました(コードを別のコンパイラーに移動したときに示されているように)。

あなたが持っているイテレータの唯一のテストは、それをend()またはbegin()、あるいはbegin()-> end()の範囲内の有効なイテレータと比較することです。これはベクトルなので、イテレータを使用して数学演算を実行できます。iT-begin()はあなたにオフセットを与えるはずです。ただし、これはすべてのコンテナに有効というわけではありません(各コンテナのドキュメントを確認してください)。

あなたがする必要があるのは、イテレータが何を指しているかをテストすることです:

for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin();
      iT != attrLst.end();  // Changed this. Notice the !=
      ++iT)                 // Changed this. Prefer pre increment for not integer types
{ 
    if ( *iT != NULL)
    {
         //code
    }
}
于 2009-06-09T07:33:32.930 に答える
2

イテレータはポインタではなく、クラスインスタンスであり、nullと比較するための二項演算子!=がありません。

于 2009-06-09T07:35:34.190 に答える
1

ifステートメントの最初の条件でイテレータをNULLと比較しようとしています。イテレータiTはリストの有効な部分に含まれている必要があるため、この最初の比較は必要ありません。

于 2009-06-09T07:16:11.233 に答える
0

イテレータをNULLと比較することは決して合法ではありませんでした。VC6はそれを可能にしましたが、そうするのは間違っていました。

あなたが与える例では、イテレータは常に何かを指しているので、比較は無意味です。チェック(* IT)!= NULLは妥当であり、引き続き機能します。

イテレータが有効なオブジェクトを指していないという本当の見通しがある場合、VC9には文書化されていない機能があります

IT._Has_container()

これは、イテレータがコンテナを指している場合はtrueになり、そうでない場合はfalseになります。イテレータを何も設定しないようにするには、空のイテレータを割り当てます。

IT = std::vector<aCattrBase*>::iterator();

上記は移植性のないコードとかなり貧弱なスタイルを表しており、それを使用するために何かを設計することはお勧めしません。ただし、VC9でコンパイルするためにVC6コードをすばやく取得する必要がある場合は、問題が発生しない可能性があります。

于 2009-06-09T09:45:27.640 に答える