将map<> :: iterator作为map<> :: const_iterator&

时间:2013-01-21 14:54:48

标签: c++ map stl iterator const-iterator

我将map< ...> :: iterator对象作为const_iterator传递给函数时遇到问题。在海湾合作委员会:

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(它,SomeString)。问题似乎是将迭代器转换为const_iterator&amp;。

我必须通过引用来接受它,因为“它”在_GetInstList()中被更改,并且调用者函数会检查它。 (“it”指针不是尖头元素。)

此外,SomeFunction()中的“it”不能是const,因为它会更改元素。

我该如何解决这个问题?

编辑: 对于那些建议问题是从迭代器到const_iterator的转换: 如果将函数原型更改为将const_iterator NOT作为引用,则代码编译正常,问题是const&amp;。

2 个答案:

答案 0 :(得分:2)

将参数类型更改为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
}

答案 1 :(得分:-2)

我想也许这种方法应该重新设计。传递迭代器是混乱的,让其他人阅读困惑。这样做有多难?