Próbuję uruchomić tę funkcję:

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;
    }

..ale daje mi ten błąd:

„Iterator mapy/zestawu nie podlega derefrencjonowaniu”

Moją pierwszą myślą było zaprzestanie dereferencji (używając it->second zamiast (*it).second), ale to niczego nie zmieniło.

Jakieś pomysły?

0
DormoTheNord 30 sierpień 2012, 11:33

2 odpowiedzi

Najlepsza odpowiedź

Najpierw go kopiujesz, następnie przesuwasz kopię, a następnie wyczyszczasz ją. Oznacza to, że wyłuskujesz end() zawsze, gdy znajduje się na elemencie przed ostatnim elementem.

Możesz łatwo przetestować to na mapie z tylko 1 wpisem - zawsze powinno nie udać się wyłuskać komp.

Powinieneś zrobić coś w rodzaju:

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;
    }
    ...
}
3
Tobias Langner 30 sierpień 2012, 11:37

Twoja pętla for biegnie poza koniec mapy, jeśli nie zostanie przerwana, więc ostatnia linia zakończy się niepowodzeniem.

0
JohnB 30 sierpień 2012, 11:36