我的问题很简单:你能有这样的事情吗:
class A {
B<A> member;
}
这是我的程序的一个非常简化的版本:
//Game.h
class Game{
std::vector<Player<Game>*> players;
}
//Player.h
template <typename T>
class Player{
std::vector<Card<T>> hand;
}
//Card.h
template <typename T>
class Card {
virtual void playCard(T& game);
}
当std::vector<Player<Game>*> players;
被解析,Game
的定义还没有完成。因此Game
将被视为不完整类型,直到它是。然后T=Game
inPlayer
和Card
在它们各自的实例化时也是不完整的。
这本身不是问题。可以使用不完整的类型,但有一个禁止使用它们的情况列表(请参阅https://en.cppreference.com/w/cpp/language/type#Incomplete_type以获取参考列表)。
从您的定义 forPlayer
并且Card
它似乎不需要完整的类型 for T
,但是这高度依赖于您遗漏的代码,例如,如果它们中的任何一个具有类型的数据成员T
或依赖于的类型T
,则可能有一个问题。
还有一个问题是是否std::vector
可以接受不完整的类型作为模板参数。在 C++17 之前这是不允许的,因为 C++17 至少在声明中是允许的(但不能访问其成员)。在任何情况下,鉴于您的代码Card<T>
在std::vector<Card<T>> hand;
实例化时T=Game
是完整的,因此向量不是问题。
(代码的发布方式,模板声明顺序中也存在一个问题,我没有解决这个问题,因为我知道包含顺序和前向声明)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句