Actualización: el shared_ptr en este ejemplo es como el de Boost, pero no es compatible con shared_polymorphic_downcast (o dynamic_pointer_cast o static_pointer_cast para el caso).Downcasting shared_ptr <Base> to shared_ptr <Derived>?
estoy tratando de inicializar un puntero compartida a una clase derivada sin perder la cuenta de referencia:
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
Hasta ahora, todo bien. No esperaba que C++ implícitamente convirtiera Base * en Derived *. Sin embargo, sí quiero la funcionalidad expresada por el código (es decir, mantener el recuento de referencias mientras se baja el puntero base). Mi primera idea era proporcionar un operador de conversión de la base de modo que una conversión implícita a Derivado podría tener lugar (por pedantes: Me gustaría comprobar que el reparto inicial es válida, no se preocupe):
struct Base {
operator Derived*();
}
// ...
Base::operator Derived*() {
return down_cast<Derived*>(this);
}
Bueno, no ayudó. Parece que el compilador ignoró por completo a mi operador de typecast. ¿Alguna idea de cómo podría hacer que la asignación shared_ptr funcione? Para puntos extra: ¿qué tipo de tipo es Base* const
? const Base*
Entiendo, pero Base* const
? ¿A qué se refiere const
en este caso?
¿Por qué necesita un shared_ptr, en lugar de shared_ptr ? –
Bill
Porque quiero acceder a la funcionalidad en Derivados que no están en Base, sin clonar el objeto (quiero un único objeto al que hagan referencia dos punteros compartidos). Por cierto, ¿por qué no funcionan los operadores de elenco? –