map<...>::iterator オブジェクトを const_iterator として関数に渡す際に問題があります & GCC:
class MyClass {
};
bool MyClass::_GetInstList(map<string,InstList>::const_iterator & it, const string & sMod)
{
cout<<"Matched\n";
it = tInstancesData.find(sMod);
if( it == tInstancesData.end() ) {
cout<<"\""<<sMod<<"\" is NOT a module\n";
return false;
}
return true;
}
bool SomeFunction()
{
map<string,InstList>::iterator it;
if( ! _GetInstList(it, SomeString) ) return false;
it->second.Add(...); // Modifying element pointed by "it"
}
私の問題は、Visual Studio 2010 では上記のコードは問題なく動作しますが、GCC 4.1.2 では、_GetInstList(it, SomeString) の関数呼び出しに一致する関数がないというエラーが表示されることです。問題は、イテレータを const_iterator & に変換しているようです。
「それ」は _GetInstList() 内で変更され、呼び出し元関数がそれをチェックするため、参照によって取得する必要があります。(「it」ポインターは、ポイントされた要素ではなく変更されます)。
また、SomeFunction() の「it」は、要素を変更するため、const にすることはできません。
どうすればこれを解決できますか?
編集: イテレータから const_iterator への変換に問題があることを示唆している場合: 関数プロトタイプが const_iterator を参照として使用しないように変更されている場合、コードは正常にコンパイルされます。問題は const & です。