【问题标题】:Initializing a set iterator in C++在 C++ 中初始化集合迭代器
【发布时间】:2012-10-14 18:23:17
【问题描述】:

我刚刚升级了一个名为 RogueWave 的第三方库,用于数据库功能。

但是,我遇到了一个非常愚蠢的编译错误,我不太确定它在抱怨什么:

 typedef std::set< EVBusCalOverride > OverrideSet;
 OverrideSet overrides;

 OverrideSet::iterator itor = this->overrides.begin( );
 while( itor != this->overrides.end( ) )

我在迭代器初始化行收到错误提示

An object or reference of type "std::set<EVBusCalOverride,std::less<EVBusCalOverride>,std::allocator<EVBusCalOverride> >::iterator" 
cannot be initialized with an rvalue of type    "std::_Tree<std::_Tset_traits<EVBusCalOverride,std::less<EVBusCalOverride>,std::allocator<EVBusCalOverride>,0> >::const_iterator".

而EVBusCalOverride 只是一个类

class EVBusCalOverride
{

   private:
   RWDate overrideDate;
   bool   businessDay;
};

RWDate 是属于 RogueWave 库的日期类型变量。

我不确定这对迭代器初始化有何影响。任何人都可以指出可能导致这种情况的正确方向吗?

【问题讨论】:

    标签: c++ aix rogue-wave


    【解决方案1】:

    看起来覆盖是常量。此代码是 const 方法的一部分吗?在这种情况下,您需要像这样初始化迭代器:

    OverrideSet::const_iterator itor = this->overrides.begin( ); 
    

    【讨论】:

      【解决方案2】:

      错误信息说:

      ... ::const_iterator

      我猜这是在 const 方法中调用的。

      【讨论】:

      • 显然不是一个正确的答案,在我看来,根本不是一个答案。 const_ 存在是因为 begin()std::set 返回 const_iterator
      【解决方案3】:

      roguewave 是一个非常古老的库。

      大多数集合都有两种类型的迭代器,iterator 允许您更改成员,const_iterator 不允许。

      std::set 是该规则的一个例外,因为您不能修改成员,因此所有迭代器都是 const。但是它们仍然支持iteratorconst_iterator,通常其中一个是另一个的别名,但roguewave 显然不支持。

      将代码中的iterator 更改为const_iterator 可能会解决问题,但我建议您尽可能更改您的STL 版本。

      【讨论】:

      • 上面的文章链接需要很长时间才能加载,然后只是对我说 STL 表示标准库的一些批评,尽管 std::set 绝对是 STL 的一部分。
      猜你喜欢
      • 2012-02-09
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      • 2015-03-05
      • 2021-06-23
      • 1970-01-01
      相关资源
      最近更新 更多