Set*_*gie 3 c++ incomplete-type
我最近惊讶地发现这段代码可以编译(至少在 gcc 和 MSVC++ 上):
template<typename T>
class A {
public:
T getT() { return T(); }
};
class B : public A<B> { };
Run Code Online (Sandbox Code Playgroud)
当这没有发生时:
class A;
class B : public A { };
class A {
public:
B getB() { return B(); }
};
Run Code Online (Sandbox Code Playgroud)
对我来说,模板类可以采用不完整的类型作为模板参数,并且有一个函数通过调用其构造函数返回一个类型,并且仍然可以编译,这对我来说似乎很奇怪。那么到底哪里需要完整的类型(或者如果列表更短,哪里不需要它们)?
以下是不需要 Complete 类型的场景:
基本上,您可以在编译器不需要知道type.
至于允许模板类型参数为不完整类型,标准在14.3.1 模板类型参数中明确说明了这一点