由于从不完整类型(https://godbolt.org/z/G35wj9)继承,因此该代码无法编译:
template<typename>
class Incomplete;
class T : public Incomplete<T> {};
template<typename>
class Incomplete {};
int main()
{
[[maybe_unused]] T x;
}
我认为该规则也适用于类模板。但是,此代码可以正常编译(https://godbolt.org/z/cU6GNt):
template<typename>
class Incomplete;
template<int d>
class T : public Incomplete<T<d>> {};
template<typename>
class Incomplete {};
int main()
{
[[maybe_unused]] T<1> x;
}
当涉及到类模板时,是否仅需要在实例化时完成基类?
最佳答案
如果它是依赖的基,那么可以。因此,编译器不知道模板定义时的Incomplete<T<d>>
是什么。毕竟,对于d
的某些值,我们可以自己指定Incomplete<T<d>>
的特殊化,这与主要模板声明完全不同。
template<>
class Incomplete<T<0>> {};
这不是循环依赖性。简单地命名特化
T<0>
不会使其实例化。这只是一个类型名称。但这确实意味着编译器没有追索权,只能等到可以检查基类是否有效为止。另一方面,如果基类不是从属类型,则将其用作基类将格式不正确。