Тот факт, что тип Service *
может быть преобразован в тип BaseService *
, никоим образом не означает, что тип Service *&
может быть преобразован в тип BaseService *&
.Это не так.Вот почему ваш первый вызов не компилируется.
Попытка использовать dynamic_cast
(или любой другой нехакерский бросок) не поможет.Результат такого броска не является lvalue.И вы не можете привязать неконстантную ссылку к чему-то, что не является lvalue.Вот почему ваш второй вызов не компилируется.
Если вы действительно хотите, чтобы ваш оператор принимал конкретно BaseService *&
, тогда вы ограничены выполнением ручного предварительного преобразования Service *
в lvalue. типа BaseService *
(т. Е. К явному объекту-указателю), а затем вызов оператора с этим lvalue
Service* service_pointer = new Service();
BaseService* base_service_pointer = service_pointer;
foo_instance << base_service_pointer;
Ваши вызовы оператора <<
будут компилироваться, если вы измените объявление, если оператордо
void operator <<(BaseService* const& iRight);
, но можете ли вы сделать это или нет, зависит от ваших намерений.Почему вы пытаетесь передать указатель по ссылке?