1

我在 GCC 上将 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(it, SomeString)。问题似乎是将迭代器转换为 const_iterator &。

我必须通过引用来获取它,因为“它”在 _GetInstList() 内部发生了变化,并且调用者函数会检查它。(“it”指针被改变而不是指向元素)。

此外, SomeFunction() 中的“它”不能是 const,因为它改变了一个元素。

我该如何解决这个问题?

编辑:对于那些认为问题是从迭代器到 const_iterator 的转换的人:如果将函数原型更改为以 const_iterator NOT 作为参考,则代码编译得很好,问题是 const &。

4

2 回答 2

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
}
于 2013-01-21T15:06:03.407 回答
-3

我认为也许无论如何都应该重新设计这种方法。传递迭代器对于其他人来说是混乱和混乱的。做到这一点有多难?

于 2013-01-21T15:04:54.183 回答