Обновление: shared_ptr в этом примере аналогичен таковому в Boost, но он не поддерживает shared_polymorphic_downcast (или dynamic_pointer_cast или static_pointer_cast в этом отношении)!
Я пытаюсь инициализировать общий указатель на производный класс без потери счетчика ссылок:
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;
Все идет нормально. Я не ожидал, что C ++ неявно преобразует Base * в Derived *. Однако мне нужны функциональные возможности, выраженные в коде (то есть поддержание счетчика ссылок при понижении базового указателя). Моя первая мысль заключалась в том, чтобы предоставить оператор приведения в Base, чтобы могло происходить неявное преобразование в Derived (для педантов: я бы проверил, что приведение вниз действительно, не волнуйтесь):
struct Base {
operator Derived* ();
}
// ...
Base::operator Derived* () {
return down_cast<Derived*>(this);
}
Что ж, это не помогло. Кажется, компилятор полностью проигнорировал мой оператор приведения типов. Есть идеи, как заставить работать задание shared_ptr? За дополнительные баллы: что это за тип Base* const
? const Base*
Я понимаю, но Base* const
? Что имеется в const
виду в этом случае?