Tengo el siguiente código que no se compila.Plantillas C++ con objetos de interfaz
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
}
entiendo que esto no va a compilar porque g
es un tipo diferente de Group<Derived>
. Para que esto funcione en Java, haría algo como Group<? extends Base> g
, pero C++ no tiene esa palabra clave hasta donde yo sé. ¿Qué se puede hacer?
Editar: Me gustaría aclarar que no quiero que sea posible establecer tipos no derivados de Base
como g
. He actualizado mi ejemplo para explicar esto.
Editar 2: Hay dos soluciones a mi problema. Dave's Me pareció simple y fácil de definir. Pero Bowie's (junto con Mark's adiciones) satisfizo mis necesidades mejor.
No sé cómo funciona este tipo de cosas en Java. ¿Qué estás tratando de decir con esa sintaxis? –
Esto tampoco funcionaría en Java. La sintaxis de ' extends ...> 'no es para apoyar la covarianza, sino que está allí para agregar una restricción sobre qué tipos puede usar el genérico. –
Ver [polimorfismo de plantilla C++] (http://stackoverflow.com/questions/2203388/c-templates-polymorphism) – Praetorian