簡體   English   中英

C ++多態與boost scoped_ptr

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM