0

私はこの関数を実行しようとしています:

os::TMXTileset* os::TMXMap::getTilesetFromGid(int gid)
    {
        TMXTileset* tileset;
        std::map<std::string, TMXTileset>::iterator it;
        std::map<std::string, TMXTileset>::iterator comp;

        for (it=tilesetMap.begin(); it != tilesetMap.end(); it++)
        {
            comp = it;
            comp++;
            if ((gid >= it->second.getFirstGid()) && (gid < comp->second.getFirstGid()))
            {
                return &it->second;
            }
        }
        tileset = &it->second;
        return tileset;
    }

..しかし、それは私にこのエラーを与えています:

「マップ/セットイテレータは参照解除できません」

私の最初の考えは、それを逆参照するのをやめることでした((* it).secondの代わりにit-> secondを使用します)が、それは何も変わりませんでした。

何か案は?

4

2 に答える 2

3

最初にそれをコピーし、次にコピーを進め、次にコピーを逆参照します。これは、最後の要素の前の要素にある場合は常にend()を逆参照することを意味します。

これは、エントリが1つしかないマップで簡単にテストできます。常にcompの逆参照に失敗するはずです。

次のようなことをする必要があります:

TMXTileset* tileset;
std::map<std::string, TMXTileset>::iterator it;
std::map<std::string, TMXTileset>::iterator comp;

for (it=tilesetMap.begin(); /*it != tilesetMap.end() can be ommited due to check for comp */; it++)
{
    comp = it;
    comp++;
    if (comp == tilesetMap.end())
    {
       break;
    }
    ...
}
于 2012-08-30T07:37:55.353 に答える
0

forループは、中断されていない場合、マップの終わりを超えて実行されるため、最後から3番目の行が失敗します。

于 2012-08-30T07:36:26.097 に答える