我有下面的代码不能编译。带接口对象的C++模板
class Base {
public:
virtual ~Base() { };
};
class Derived : public Base { };
class NotDerived { };
template <typename T>
class Group { };
int main() {
Group<Base> *g = NULL;
g = new Group<Base>(); // Works
g = new Group<Derived>(); // Error, but I want it to work
g = new Group<NotDerived>(); // Error, as expected
}
我明白,这不能编译,因为g
是不同的类型Group<Derived>
。为了在Java中完成这项工作,我会做一些事情,例如Group<? extends Base> g
,但据我所知C++没有那个关键字。可以做什么?
编辑:我想澄清一下,我不希望它有可能将Base
的类型设置为g
。我已经更新了我的例子来解释这一点。
编辑2:我的问题有两种解决方案。 Dave's我发现很简单,很容易定义。但Bowie's(加上Mark's)更适合我的需求。
我不熟悉Java是如何工作的。你想用这种语法说什么? –
这在Java中也不起作用。 '<?的语法扩展...>不是为了支持协方差,而是在那里为泛型可能使用的类型添加约束。 –
请参阅[C++模板多态性](http://stackoverflow.com/questions/2203388/c-templates-polymorphism) – Praetorian