Si on simplifie davantage le code que tu donnes, il apparaît que le code suivant serait à l'origine du problème.
Pourtant, ce code est licite est compilé sans problème. Le problème doit venir d'ailleurs. Tu peux essayer de simplifier ton code jusqu'à qu'il soit valide pour déterminer la source du problème.
class UnitTower;
class Shoot
{
public:
Shoot(UnitTower* tower)
: tower(tower)
{}
protected:
UnitTower* tower;
};
class UnitTower
{
public:
void update()
{
Shoot shoot(this);
}
};
int main()
{
return 0;
}