由于从不完整类型(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>不会使其实例化。这只是一个类型名称。但这确实意味着编译器没有追索权,只能等到可以检查基类是否有效为止。

另一方面,如果基类不是从属类型,则将其用作基类将格式不正确。

10-06 13:59