Причина довольно проста: даже когда derived
относится к base
, shared_ptr<derived>
не относится к shared_ptr<base>
, поэтому не существует неявного преобразования из одного в другое, если шаблон явно не предоставляет его (ито же самое относится к любому другому шаблону, созданному таким же образом).
Однако, за исключением, я не уверен, какую проблему вы действительно пытаетесь решить.Обычно вы хотите бросить объект (не указатель) и вы хотите перехватить ссылку const
.Поскольку у вас нет реальной возможности иметь несколько указателей на один и тот же объект исключения, я не уверен, какую проблему вы решите с помощью shared_ptr<exception_object>
.