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)が作成されますが、非定数参照を一時オブジェクトにバインドすることはできませんfunc。そのため、 。に引数を指定しない限り、コンパイラはエラーを発行します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、正しくありません。dDerived

于 2012-06-18T09:35:28.747 に答える