Попробуйте {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 в еще одном объекте ... какие-нибудь ярлыки?

Ответы на вопрос(6)

Ваш ответ на вопрос