【问题标题】:C++ polymorphism with boost scoped_ptr带有 boost scoped_ptr 的 C++ 多态性
【发布时间】:2012-03-23 19:44:53
【问题描述】:

为什么下面的代码不允许调用 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 吗?

带有 boost 1.49 的 g++ 给了我:

error: invalid initialization of reference of type ‘boost::scoped_ptr<A>&’ from expression of type ‘boost::scoped_ptr<B>’

【问题讨论】:

    标签: c++ boost polymorphism scoped-ptr


    【解决方案1】:

    那是因为foo 出于某种原因采用了一个作用域指针通过引用。这是完全没有必要的,也是呼叫失败的原因。存在从scoped_ptr&lt;B&gt;scoped_ptr&lt;A&gt; 的转换,但不是从scoped_ptr&lt;B&gt;&amp;scoped_ptr&lt;A&gt;&amp;

    您应该将它作为对 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
    

    【讨论】:

    • 那不需要具有私有复制构造函数的 scoped_ptrs 的副本吗?无论如何,我希望 scoped_ptr 在被调用者中持续存在。
    • 更改 foo() 以生成 scoped_ptr 而不是引用给了我:错误:从 'boost::scoped_ptr' 转换为非标量类型 'boost::scoped_ptr' 请求
    • 如果你希望它在被调用者中持续存在,那么我很确定你不想要scoped_ptr。如果您要转让所有权,则需要unique_ptr,如果两个地方都保留指向它的指针,则需要shared_ptr
    • @Armen:我很困惑——为什么 const 引用有效而 const 无效?
    • @ATemp:因为为了通过引用传递某些东西,类型必须完全匹配。但如果它是对 const 的引用,则可以进行转换。 C++ 规则
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多