Я думаю, что это должно быть так:
roomlist[roomid].playerlist.remove_if(
[socketid](GamePlayer const & gp) { return gp.socketno == socketid; }
);
Если у вас нет лямбд, вам придется написать небольшой предикат самостоятельно, или вы пойдете ручным путем; но теперь остерегайтесь петли:
for (std::list<GamePlayer>::iterator it = roomlist[roomid].playerlist.begin();
it != roomlist[roomid].playerlist.end(); /* no increment */ )
{
if (it->socketno == socketid)
{
it = roomlist[roomid].playerlist.erase(it);
}
else
{
++it;
}
}