0

家に語学弁護士はいますか?

次のコードはコンパイルする必要がありますか?

include <set>

bool fn( const std::set<int>& rSet )
{
  if ( rSet.find( 42 ) != rSet.end() ) return true;
  return false;
}

プラットフォームの 1 つ (Sun Workshop) では、これはコンパイルされません。これは、find 関数が iterator を返し、end 関数が const_iterator を返したこと、およびこれらの型の間に有効な比較演算子がないことを報告しています。

以下はコンパイルします:

include <set>

bool fn( std::set<int>& rSet )
{
  if ( rSet.find( 42 ) != rSet.end() ) return true;
  return false;
}
4

3 に答える 3

9

コンパイルする必要があります。セットには、2つのfind()関数と2つのend()関数(constバージョンとnon-constバージョン)が含まれています。SunのSTLがどういうわけか壊れているように聞こえます。const参照を渡すので、コンパイラーは正しいfind()およびend()関数を選択できるはずです。

于 2009-02-13T18:14:10.917 に答える
3

Sun C++ コンパイラを使用してから数年になりますが、当時は 2 つの STL バージョンがありました。1 つはレガシー バージョンで、完全または正しいとは言えませんでしたが、古いプログラムをコンパイルするために保持されていました。もう 1 つは stlport でした。正しい STL バージョンを使用していることを確認してください。

于 2009-02-13T18:19:03.697 に答える
2

私のプラットフォームでこの動作を正確に再現することはできませんが、過去に STL マップで同様の問題に遭遇しました。find()の結果を宣言された変数に明示的に代入し、その変数を の結果と比較する必要があることがわかりましたend()。試してみる価値があるかもしれません。

于 2009-02-13T18:09:20.130 に答える