Передача map & lt; & gt; :: iterator as map & lt; & gt; :: const_iterator & amp;

У меня проблема с передачей карты<…> :: Объект-итератор для функции в качестве 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 &,

1

Решение

Измените тип аргумента на 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
}
2

Другие решения

Я думаю, может быть, этот метод должен быть переработан в любом случае. Передача итераторов является грязной и запутанной для чтения другими. Насколько сложно это сделать?

-2

По вопросам рекламы [email protected]