1

map<...>::iterator オブジェクトを 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() の「it」は、要素を変更するため、const にすることはできません。

どうすればこれを解決できますか?

編集: イテレータから const_iterator への変換に問題があることを示唆している場合: 関数プロトタイプが const_iterator を参照として使用しないように変更されている場合、コードは正常にコンパイルされます。問題は 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 に答える