【问题标题】:Problems with const set&. Compiler/STL bug or non-portable usage?const set& 的问题。编译器/STL 错误或不可移植使用?
【发布时间】:2009-02-13 18:00:38
【问题描述】:

家里有语言律师吗?

下面的代码应该编译吗?

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;
}

【问题讨论】:

  • 不是您问题的答案。但最好写成: return rSet.find( 42 ) != rSet.end();

标签: c++ stl constants set standards


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多