2
#include <boost/smart_ptr.hpp>

class Base {
};

class Derived : public Base {
  public:
    Derived() : Base() {}
};

void func(/*const*/ boost::shared_ptr<Base>& obj) {
}

int main() {
  boost::shared_ptr<Base> b;
  boost::shared_ptr<Derived> d;
  func(b);
  func(d);
}

这与 func 签名中的 const 一起编译,但不是没有它。错误出现在调用的行中func(d);

对我有什么提示吗?

4

2 回答 2

7

阅读文档时,boost::shared_ptr我们发现以下内容:

Ashared_ptr<T>可以隐式转换为shared_ptr<U>只要T*可以隐式转换为U*


这意味着boost::shared_ptr<Derived>可以隐式转换为类型的对象boost::shared_ptr<Base>

当执行此转换时,func (d)将创建一个临时对象,尽管非常量引用不能绑定到临时对象 - 这就是为什么编译器会发出错误,除非您将参数设置为funca const&

于 2012-06-18T09:37:20.370 回答
1

假设func有内容:

void func(boost::shared_ptr<Base>& obj) {
    obj = boost::shared_ptr<Base>(new Base);
}

调用它boost::shared_ptr<Derived> d是不正确的,因为它d不包含指向Derived.

于 2012-06-18T09:35:28.747 回答