У меня проблема с передачей карты<…> :: Объект-итератор для функции в качестве 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 () не может быть константным, поскольку оно изменяет элемент.
Как я могу решить это?
РЕДАКТИРОВАТЬ:
Для тех, кто предполагает, что проблема заключается в преобразовании из итератора в const_iterator:
Код компилируется нормально, если прототип функции изменен, чтобы взять const_iterator NOT в качестве ссылки, проблема заключается в const &,
Измените тип аргумента на const map<string,InstList>::const_iterator&
или просто map<string,InstList>::const_iterator
,
Вот пример, демонстрирующий вашу проблему (и решение) с простыми типами:
void func1(double& x){}
void func2(const double& x){}
int main()
{
int x;
func1(x); // error: 'func1' : cannot convert parameter 1 from 'int' to 'double &'
func2(x); // succeeds
}
Я думаю, может быть, этот метод должен быть переработан в любом случае. Передача итераторов является грязной и запутанной для чтения другими. Насколько сложно это сделать?