【问题标题】:Iteration over set elements in C++ does not compileC ++中对集合元素的迭代无法编译
【发布时间】:2013-09-10 09:35:17
【问题描述】:

我已经好几年没有使用 C++ 了,现在我需要维护一个 C++ 项目。我有以下一段代码,它似乎可以在一个项目中编译,但不能在另一个项目中编译。

list.h

#include "mytype.h"
#include <set>

typedef std::set<MYTYPE> MYTYPE_LIST;
typedef MYTYPE_LIST::iterator MYTYPE_LIST_ITERATOR;

class LIST {

[...]

MYTYPE_LIST list;
};

list.cpp

void 
LIST::somemethod(MYTYPE* requester)
{

   MYTYPE_LIST_ITERATOR it;
   for (it = list.begin(); it != list.end() ; it++ )
   {
      MYTYPE& info = (*it); // Error on this line
      [...]
   }
}

我正在使用 VS 2010 编译我的项目,并且在标记的行上出现以下错误:

error C2440: 'initializing' : cannot convert from 'const MYTYPE' to 'MYTYPE &'
IntelliSense: qualifiers dropped in binding reference of type "MYTYPE &" to initializer of type "const MYTYPE"

我用谷歌搜索了这些错误,据我了解,(*it) 不应该是 const(因为 'it' 不是 ::const_iterator,请参阅here),因此,我应该能够分配它到引用变量。

【问题讨论】:

    标签: visual-studio-2010 visual-c++ stl


    【解决方案1】:

    std::set 中,数据是键,由于键是常量,因此您无法获得非常量引用。

    【讨论】:

      【解决方案2】:

      最终我发现,在 VS 2010 中,微软引入了一项更改,破坏了与此代码的向后兼容性。

      显然,进行此更改是有充分理由的 - 修改集合元素可能会破坏集合的不变量。请参阅here,“问题 3:错误 C2662:'NamedNumber::change_name':无法将 'this' 指针从 'const NamedNumber' 转换为 'NamedNumber &'”。

      另一个项目是用旧版本的 Visual Studio 编译的,所以我们在那里没有问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-17
        • 1970-01-01
        • 1970-01-01
        • 2010-12-21
        • 2012-05-13
        相关资源
        最近更新 更多