Mise à jour: le shared_ptr dans cet exemple est comme celui de Boost, mais il ne prend pas en charge shared_polymorphic_downcast (ou dynamic_pointer_cast ou static_pointer_cast d'ailleurs)!
J'essaye d'initialiser un pointeur partagé vers une classe dérivée sans perdre le nombre de références:
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;
Jusqu'ici tout va bien. Je ne m'attendais pas à ce que C ++ convertisse implicitement Base * en Derived *. Cependant, je veux la fonctionnalité exprimée par le code (c'est-à-dire maintenir le nombre de références tout en abaissant le pointeur de base). Ma première pensée a été de fournir un opérateur de cast dans Base afin qu'une conversion implicite en Derived puisse avoir lieu (pour les pédants: je vérifierais que le down cast est valide, ne vous inquiétez pas):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Eh bien, cela n'a pas aidé. Il semble que le compilateur a complètement ignoré mon opérateur de transtypage. Des idées sur la façon dont je pourrais faire fonctionner le devoir shared_ptr? Pour les points supplémentaires: quel type de type Base* const
est-ce? const Base*
Je comprends, mais Base* const
? A quoi fait const
référence dans ce cas?