class Base {
public:
template<typename T>
static Base* construct() {
return new Derived<T>();
}
};
template<typename T>
class Derived : public Base {
public:
Derived() {}
};
Run Code Online (Sandbox Code Playgroud)
该代码生成编译错误(VS Studio 2017):
syntax error: unexpected token 'identifier', expected 'type specifier'
Run Code Online (Sandbox Code Playgroud)
这是无效的C ++吗?这种模式不可能吗?
声明Base为:
class Base {
public:
template<typename T>
static Base* construct();
}
Run Code Online (Sandbox Code Playgroud)
然后声明Derived:
template<typename T>
class Derived : public Base {
public:
Derived() {}
};
Run Code Online (Sandbox Code Playgroud)
然后定义Base::construct:
static Base* Base::construct() {
return new Derived<T>();
}
Run Code Online (Sandbox Code Playgroud)
编译器需要完整的定义Derived才能处理newin Base::construct。