Полное объявление типа должно идти до его использования (кроме объявлений со ссылкой/указателем на данный тип, в этом случае хватит forward declaration).
ок я вроде догнал что как а почему тогда с функцией это работает а с классом нет ? окей компилятор должен знать сколько памяти нужно и тд а с функцией он что ищет в моменте вызова ?