Проблема в том, что у вас круговая зависимость заголовка; "BarFly.h"
и "BarFlyOwnedStates.h"
каждый пытается включить друг друга. В результате, когда вы включаете "BarFly.h"
, включающие охранники означают, что определение BarFly
приходит после , а CarousingState
, поэтому BarFly
не было объявлено в точке, в которой оно используется в качестве аргумента шаблона.
Строка A - это «предварительное объявление» (или просто «объявление»); он объявляет, что класс существует, но не определяет класс. Пока класс не определен, он известен как «неполный тип» и может использоваться в некоторых ситуациях.
В общем, вы должны избегать таких циклических зависимостей, так как они могут вызвать много путаницы Включайте заголовок только тогда, когда вам это действительно нужно, и просто используйте предварительные объявления классов, когда это возможно.
В этом случае похоже, что вы можете удалить #include "BarFlyOwnedStates.h"
из BarFly.h
, и в зависимости от того, что State
делает с аргументом шаблона, вы также можете удалить #include "BarFly.h"
из BarFlyOwnedStates.h
(сохраняя предварительная декларация по строке А). Вам нужно будет включить оба заголовка из исходного файла.