0

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

列表.h

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

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

class LIST {

[...]

MYTYPE_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,请参见此处),因此,我应该能够将其分配给参考变量.

4

2 回答 2

1

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

于 2013-09-10T09:43:03.477 回答
0

最终我发现在 VS 2010 中,微软引入了一个改变,它破坏了与这段代码的向后兼容性。

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

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

于 2013-09-10T09:35:17.313 回答