Creo que se debe a que las clases no están bien ordenadas
Primero debes declarar la clase visitante porque la estás llamando en la clase TGato
Código:
//Clase abstracta del visitante
class TReaccion{
public:
virtual void visit(class TGato*)=0; // en este caso TGato es un apuntador no se necesita conocer como está estructurada la clase para crear un apuntador, solo se debe indicar que es un apuntador a una clase.
};
class TAnimal{ //Clase abstracta del elemento.
public:
virtual void Accept(TReaccion&)=0;
};
//Interfaz Clase hija
class TGato : public TAnimal{ //Clase hija de TAnimal
public:
TGato();
virtual void Accept(TReaccion&); // Aquí se usa la clase TReaccion y se debe conocer como está declarada, por eso la clase TReaccion debe estar declarada antes que la clase TGato.
};