Update: o shared_ptr neste exemplo é como o do Boost, mas não suporta shared_polymorphic_downcast (ou dynamic_pointer_cast ou static_pointer_cast para esse assunto)!
Estou tentando inicializar um ponteiro compartilhado para uma classe derivada sem perder a contagem de referência:
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;
Por enquanto, tudo bem. Eu não esperava que o C ++ convertesse implicitamente Base * em Derivado *. No entanto, eu quero a funcionalidade expressa pelo código (ou seja, manter a contagem de referência enquanto reduz o ponteiro de base). Meu primeiro pensamento foi fornecer um operador de elenco na Base para que uma conversão implícita para Derivado pudesse ocorrer (para pedantes: eu verificaria se o cast para baixo é válido, não se preocupe):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Bem, não ajudou. Parece que o compilador ignorou completamente meu operador typecast. Alguma ideia de como eu poderia fazer a atribuição shared_ptr funcionar? Para pontos extras: que tipo de tipo Base* const
é? const Base*
Eu entendo, mas Base* const
? A que se const
refere neste caso?