Попробуйте {return SmartPtr <Q> (t); } Компилятор скажет вам, можно ли присвоить T * Q * без всех приведений. Убедитесь, что ваша логика подсчета ссылок может разделять счетчик ссылок между типами шаблонов. Подсчет ссылок int * должен быть в состоянии.
ствую, что об этом уже спрашивали, но я не могу найти его на SO, и при этом я не могу найти ничего полезного в Google. Может быть, слово «ковариантный» - это не то слово, которое я ищу, но эта концепция очень похожа на ковариантные типы возвращаемых значений для функций, поэтому я думаю, что это, вероятно, правильно. Вот что я хочу сделать, и это дает мне ошибку компилятора:
class Base;
class Derived : public Base;
SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
Предположим, что эти классы полностью раскрыты ... Я думаю, вы поняли идею. Это не может конвертироватьSmartPtr<Derived>
вSmartPtr<Base>
по какой-то неясной причине. Напоминаю, что это нормально в C ++ и многих других языках, хотя сейчас я не могу вспомнить почему.
Мой основной вопрос: каков наилучший способ выполнить эту операцию присваивания? В настоящее время я вытаскиваю указатель изSmartPtr
явно передавая его в базовый тип, затем оборачивая в новыйSmartPtr
соответствующего типа (обратите внимание, что это не утечка ресурсов, потому что наши доморощенныеSmartPtr
класс использует навязчивый подсчет ссылок). Это долго и грязно, особенно когда мне нужно обернутьSmartPtr
в еще одном объекте ... какие-нибудь ярлыки?