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 循环将超出地图的末尾,因此您的倒数第三行将失败。

于 2012-08-30T07:36:26.097 回答