0

私は数年間 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;
};

リスト.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

0

最終的に、VS 2010 で、Microsoft がこのコードとの下位互換性を損なう変更を導入したことがわかりました。

どうやら、この変更は正当な理由で行われたようです。セット要素を変更すると、セットの不変条件が壊れる可能性があります。ここを参照してください、「問題 3: エラー C2662: 'NamedNumber::change_name' : 'this' ポインターを 'const NamedNumber' から 'NamedNumber &' に変換できません」。

もう 1 つのプロジェクトは古いバージョンの Visual Studio でコンパイルされているため、問題はありませんでした。

于 2013-09-10T09:35:17.313 に答える