Это потому, что foo
по какой-то причине принимает указатель с областью действия по ссылке . Это совершенно не нужно и является причиной сбоя вызова. Существует преобразование из scoped_ptr<B>
в scoped_ptr<A>
, но не из scoped_ptr<B>&
в scoped_ptr<A>&
.
Вы должны передать его как ссылку на const.
void foo(boost::scoped_ptr<A> const & a) {}
Кстати, это не «проблема» умных указателей как таковых. Следующий код не работает по тем же причинам, что и ваш.
void foo(A*& p) {}
int main()
{
B* p = new B;
foo(p); //FAIL
}
Чтобы исправить это, вы должны передать указатель либо по значению, либо, если вы достаточно извращены, по ссылке на const
void foo (A * const & p); // <-- a perv wrote this