Creo que se me ha preguntado antes, pero no puedo encontrarlo en SO, ni puedo encontrar nada útil en Google. Tal vez "covariante" no es la palabra que estoy buscando, pero este concepto es muy similar a los tipos de retorno covariante en las funciones, por lo que creo que es probablemente correcto. Esto es lo que quiero hacer y me da un error del compilador:Plantillas de covariantes de C++
class Base;
class Derived : public Base;
SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
Asumir esas clases se plasmen plenamente ... Creo que se entiende la idea. No puede convertir un SmartPtr<Derived>
en un SmartPtr<Base>
por algún motivo poco claro. Recuerdo que esto es normal en C++ y en muchos otros idiomas, aunque por el momento no puedo recordar por qué.
Mi pregunta de raíz es: ¿cuál es la mejor manera de realizar esta operación de asignación? Actualmente, estoy sacando el puntero del SmartPtr
, actualizándolo explícitamente al tipo base, y luego envolviéndolo en un nuevo SmartPtr
del tipo apropiado (tenga en cuenta que esto no está filtrando recursos porque nuestra clase de SmartPtr
de fabricación propia utiliza una referencia intrusiva contando). Eso es largo y desordenado, especialmente cuando necesito envolver el SmartPtr
en otro objeto ... ¿cualquier atajo?
ocultar comentarios @MSN: He aprendido por prueba y error que esto no es suficiente para cumplir con el constructor de copias y el operador de asignaciones "normales". Por lo tanto, debe implementar ambos: SmartPtr (const SmartPtr &) AND template SmartPtr (const SmartPtr &) (igual para op =) –
mmmmmmmm
Bueno, sí, eso es lo que quise decir :) – MSN
De C++ 11 en adelante también agregas move-constructor y move-assignment (ésos con '&&'). –