0

家里有语言律师吗?

下面的代码应该编译吗?

include <set>

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

在其中一个平台(Sun Workshop)上,这不会编译。它报告 find 函数返回了一个迭代器,而 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

它应该编译。Set 包括 2 个 find() 函数和 2 个 end() 函数(const 和 non-const 版本)。这听起来像是 Sun 的 STL 以某种方式被破坏了。由于您传递的是 const 引用,因此编译器应该能够选择正确的 find() 和 end() 函数。

于 2009-02-13T18:14:10.917 回答
3

我使用 Sun C++ 编译器已经有几年了,但当时它有两个 STL 版本。一个是遗留版本,它远不完整或不正确,但他们一直在编译旧程序,一个是 stlport。检查以确保您使用的是正确的 STL 版本。

于 2009-02-13T18:19:03.697 回答
2

我无法在我的平台上复制这种确切的行为,但我过去在使用 STL 映射时遇到过类似的问题。我发现我需要将 的结果显式分配给find()声明的变量,然后将该变量与end(). 这可能值得一试。

于 2009-02-13T18:09:20.130 回答