房子里有没有语言律师?
以下代码是否应该编译?
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;
}
答案 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()
的结果进行比较。这可能值得一试。