Проблема с перегрузкой оператора преобразования C ++ - PullRequest
3 голосов
/ 29 июля 2010

У меня есть свой собственный класс SmartPointer.

В некоторых случаях SmartPtr содержит класс, который наследуется от базового класса, и я хотел бы преобразовать SmartPtr<ClassX> into SmartPtr<BaseClassOfClassX>;

Я пытаюсьДля этого перегрузите оператор преобразования SmartPtr.

Он отлично работает для самого класса, например:

template<class newType>
operator SmartPtr<newType>() const
{
    return SmartPtr<newType>((SmartPtr<newType>*)this);
}

, но не для указателя на класс, я попробовал следующее, ион никогда не получает вызов и выдает следующую ошибку:

template<class newType>
operator SmartPtr<newType>*() const
{
        return static_cast<SmartPtr<newType>*>(this);
}

Простой код для получения ошибки:

    SmartPtr<ClassX> test(pClassX);
    SmartPtr<BaseClassOfClassX>* ob = &test;

ERROR:
cannot convert from 'SmartPtr<T> *' to 'SmartPtr<T> *'

Кто-нибудь видит, что не так с моей второй перегрузкой преобразования?Спасибо

1 Ответ

0 голосов
/ 12 марта 2012

Из стандарта C ++: " Операторная функция должна быть либо нестатической функцией-членом, либо функцией, не являющейся членом, и иметь как минимум один параметр, тип которого является классом, ссылкой на класс,перечисление или ссылка на перечисление."

Поскольку тип &test не является ни классом, ни чем-либо неявно конвертируемым в класс, вы не можете перегружать типы типов для указателя напрямую.В зависимости от того, зачем вам нужны указатели на ваши умные указатели, возможно, вы действительно захотите использовать ссылки, которые встречаются гораздо чаще.

...