全くオペレータがタイプ「タイプ」の左側のオペランドをとる見つかりません - エラーC2678 VS2008にVC6からC ++コードを移行した後
-
13-09-2019 - |
質問
このコードの一部は、VC6でファイルをコンパイルするが、VS 2008にはエラーが発生します。なぜ誰も教えてもらえますか? 私は、あなたは、もはや(0のtypedefである)NULLへのポインタを比較することはできませんので、それはあると思います。 その場合は、どのように私は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>' (あるいは許容される変換がない)
解決
「のstd ::ベクトル::イテレータ」のタイプは、あなたがNULLにそれを比較することはできませんので、必ずポインタ型ではありません。
古いコンパイラではそれだけでポインタであることを起こったので、あなたのコードがコンパイル。 (あなたは別のコンパイラにコードを移動したときに示すように)しかし、あなただけの幸運ます。
あなたが持っているイテレータの唯一のテストは、(終了)または(開始するには、それを比較することである)、または範囲内の任意の有効なイテレータは、()開始 - >終わりを()。これはベクトルですので、あなたはイテレータで数学的な操作を行うことができます。あなたにオフセットを与える必要があります()それが、始まります。しかし、これは(各コンテナのマニュアルを参照してください)すべてのコンテナには有効ではありません。
あなたがする必要があるのは何でイテレータポイントテストです。
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
}
}
他のヒント
イテレータはポインタではありません、それはクラスのインスタンスだと二項演算子を持っていません!= nullを指定して、それを比較する。
あなたはif文で最初の状態にNULLにイテレータを比較しようとしています。あなたはそれがalaysリストの有効な部分内でなければならないイテレータとして、この最初の比較を必要としません。
NULLにイテレータを比較すると、法的なことはなかったです。 VC6は、あなたがそれをやらせるが、そうすることは間違っていた。
イテレータは常に何かを指すようになりますように、あなたが与える例では、比較は無意味です。チェック(* IT)!= NULLが合理的であるとまだ動作します。
イテレータが有効なオブジェクトを指していないことを実際の見込みがある場合は、VC9は文書化されていない機能があります。
IT._Has_container()
イテレータがない場合は、それは、コンテナへのイテレータポイント場合はtrueとfalseになります。何にイテレータを設定するには、空のイテレータを割り当てます:
IT = std::vector<aCattrBase*>::iterator();
上記の非ポータブルコードとかなり貧弱なスタイルを表して、私はそれを使用するために何かを設計することはお勧めしません。あなたはVC9でコンパイルするために迅速にいくつかのVC6のコードを取得する必要がある場合は、それが悩みのあなたを得る可能性があります。