Когда std::vector<Player<Game>*> players;
проанализирован, определение Game
еще не завершено.Поэтому Game
будет считаться неполным типом до тех пор, пока оно не будет.Тогда T=Game
в Player
и Card
также неполны в своих соответствующих экземплярах.
Само по себе это не проблема.Можно использовать неполные типы, но есть список ситуаций, в которых их использование запрещено (список ссылок см. https://en.cppreference.com/w/cpp/language/type#Incomplete_type).
Из вашего определения для Player
и Card
не похоже, что для T
требуется полный тип, однако это сильно зависит от кода, который вы пропустили, например, если у любого из них есть элемент данных типа T
или тип, зависящий от T
,тогда может возникнуть проблема.
Существует также вопрос, может ли std::vector
принять неполный тип в качестве аргумента шаблона.До C ++ 17 это было запрещено, так как C ++ 17 разрешено, по крайней мере, в объявлении (но не для доступа к его членам).В любом случае, учитывая, что ваш код Card<T>
в std::vector<Card<T>> hand;
, инстанцированный с T=Game
, завершен, и поэтому вектор не является проблемой.
(Способ, которым был отправлен код, также имеет место впорядок объявления шаблона, к которому я не обращался, так как я знаю порядок включения и предварительные объявления)