[英]C++ polymorphism with boost scoped_ptr
為什么以下代碼不允許調用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.