我已经使用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),因此,我应该能够将它分配给引用变量。
答案 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编译的,所以我们没有问题。