When std::vector<Player<Game>*> players;
is parsed, Game
's definition is not yet complete. Therefore Game
will be considered incomplete type until its is. Then T=Game
in Player
and Card
are also incomplete at their respective instantiation.
This is not a problem in itself. Incomplete types may be used, but there is a list of situation in which their use is prohibited (see https://en.cppreference.com/w/cpp/language/type#Incomplete_type for a reference list).
From your definition for Player
and Card
it doesn't seem like it requires a complete type for T
, however this is highly dependent on the code you left out, e.g. if either of them have a data member of type T
or type dependent on T
, then there might be a problem.
There is also the question of whether std::vector
can accept an incomplete type as template argument. Before C++17 this was not allowed, since C++17 it is allowed at least in the declaration (but not for access to its members). In any case, given your code Card<T>
at std::vector<Card<T>> hand;
instantiated with T=Game
is complete and so the vector is not an issue.
(The way the code was posted, there is also an issue in the template declaration order which I did not address as I have knowledge of the include order and forward-declarations)