我最近惊讶地发现这段代码可以编译(至少在 gcc 和 MSVC++ 上):
template<typename T>
class A {
public:
T getT() { return T(); }
};
class B : public A<B> { };
当这没有发生时:
class A;
class B : public A { };
class A {
public:
B getB() { return B(); }
};
对我来说,模板类可以采用不完整的类型作为模板参数,并具有一个通过调用其构造函数返回类型并仍然可以编译的函数,这似乎很奇怪。那么到底哪里需要完整的类型(或者如果列表更短,哪里不需要它们)?
以下是不需要 Complete 类型的场景:
- 将成员声明为不完整类型的指针或引用。
- 声明接受/返回不完整类型的函数。
- 定义接受/返回不完整类型的指针/引用的函数。
- 作为模板类型参数。
基本上,您可以在编译器不需要知道内存布局的任何地方使用不完整类型。type
.
至于允许模板类型参数为不完整类型,标准在14.3.1 模板类型参数
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)