首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost scoped_ptr的C++多态性

boost scoped_ptr的C++多态性
EN

Stack Overflow用户
提问于 2012-03-24 03:44:54
回答 1查看 939关注 0票数 3

为什么下面的代码不允许调用foo(ptr)?

代码语言:javascript
复制
#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++为我提供了:

代码语言:javascript
复制
error: invalid initialization of reference of type ‘boost::scoped_ptr<A>&’ from expression of type ‘boost::scoped_ptr<B>’
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-24 03:47:05

这是因为出于某种原因,foo通过引用来获取作用域指针。这是完全不必要的,也是调用失败的原因。存在从scoped_ptr<B>scoped_ptr<A>的转换,但不是从scoped_ptr<B>&scoped_ptr<A>&的转换。

您应该将它作为引用传递给const。

代码语言:javascript
复制
void foo(boost::scoped_ptr<A> const & a) {}

顺便说一句,这不是智能指针本身的“问题”。以下代码失败的原因与您的相同。

代码语言:javascript
复制
void foo(A*& p) {}
int main()
{
    B* p = new B;
    foo(p); //FAIL
}

为了解决这个问题,你必须通过值来传递指针,或者,如果你是完全错误的,通过引用const来传递指针

代码语言:javascript
复制
 void foo (A * const & p); // <-- a perv wrote this
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9845584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档