在C ++中对set元素的迭代不能编译

时间:2013-09-10 09:35:17

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

我已经使用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"

我搜索了这些错误,据我所知,(*它)不应该是const(因为&#39;它不是:: const_iterator,请参阅here),因此,我应该能够将它分配给引用变量。

2 个答案:

答案 0 :(得分:1)

std::set中,数据是关键,因为键是常量,所以无法获得非const引用。

答案 1 :(得分:0)

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

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

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