将map<>::iterator作为map<>::const_iterator传递

Passing map<>::iterator as map<>::const_iterator &

本文关键字:iterator gt map lt 传递 作为 const      更新时间:2023-10-16

我在将map<...>::iterator对象传递给函数时遇到问题,作为const_iterator和GCC上的函数:

class MyClass {

};
bool MyClass::_GetInstList(map<string,InstList>::const_iterator & it, const string & sMod)
{
    cout<<"Matchedn";
    it = tInstancesData.find(sMod);
    if( it == tInstancesData.end() ) {
        cout<<"""<<sMod<<"" is NOT a modulen";
        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(它,SomeString)。问题似乎是将迭代器转换为const_iterator&。

我必须通过引用来获取它,因为"it"在 _GetInstList() 中被更改并且调用者函数会检查它。(更改了"it"指针而不是指向元素)。

此外,SomeFunction() 中的"it"不能是常量,因为它会更改一个元素。

我该如何解决这个问题?

编辑:对于那些认为问题在于从迭代器到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
}
我认为

也许无论如何都应该重新设计这种方法。传递迭代器对于其他人来说既混乱又令人困惑。这样做有多难?