const set&的问题。编译器/ STL错误或非​​便携式使用?

时间:2009-02-13 18:00:38

标签: c++ stl const set standards

房子里有没有语言律师?

以下代码是否应该编译?

include <set>

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

在其中一个平台(Sun Workshop)上,这不会编译。它报告find函数返回一个迭代器和返回const_iterator的end函数,并且它们在这些类型之间没有有效的比较运算符。

以下编译:

include <set>

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

3 个答案:

答案 0 :(得分:9)

它应该编译。 Set包括2个find()函数和2个end()函数(const和非const版本)。有点像Sun的STL在某种程度上被打破了。由于传入const引用,编译器应该能够选择正确的find()和end()函数。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

我不能在我的平台上复制这个确切的行为,但我过去遇到过与STL地图类似的问题。我发现我需要将find()的结果显式地分配给声明的变量,然后将该变量与end()的结果进行比较。这可能值得一试。