为什么以下代码不允许调用foo(ptr)?
#include <boost/scoped_ptr.hpp>
struct A {
virtual ~A() {}
};
struct B: public A {};
void foo(boost::scoped_ptr<A>& a) {}
void goo(A& a) {}
int main() {
boost::scoped_ptr<B> ptr(new B);
foo(ptr);
B b;
goo(b);
}
我们传递引用的相应表单按预期工作.我们应该不做多态
使用boost scoped_ptr?
g with boost 1.49给了我:
error: invalid initialization of reference of type ‘boost::scoped_ptr<A>&’ from expression of type ‘boost::scoped_ptr<B>’
解决方法:
那是因为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