2

だから私はそのようなものを持っています

class baseclass {
....
}

class derived : public baseclass {
...
}

void func(boost::shared_ptr<baseclass>& a){
//stuff
}

boost::shared_ptr<derived> foo;

func(foo);

これは機能しますか?同じタイプではないからだと思いますが、正しいタイプにキャストする能力がないので、これを機能させるために考えられる回避策はありますか?

編集:私が知っている限りキャストできない理由は、型のベクトルで並べ替えを行っているためboost::shared_ptr<derived>、vec.begin() と vec.end() でのみ並べ替えを呼び出すためです。

4

3 に答える 3

4

shared_ptr<T>に暗黙的に変換できるときはshared_ptr<U>常にT*に暗黙的に変換できますU*。特に、shared_ptr<T>は暗黙のうちに に変換可能です。ここで、U は のアクセス可能な基底であり、shared_ptr<T const>に変換されます。shared_ptr<U>Tshared_ptr<void>

http://www.boost.org/doc/libs/1_53_0/libs/smart_ptr/shared_ptr.htm#Members

ただし、コードが現在のように機能しません。オブジェクトの暗黙的な構築はboost::shared_ptr<baseclass>、const 参照にバインドするか、構築後も存続するようにコピーする必要があります。

どちらかを検討してください

void func(boost::shared_ptr<baseclass> a)

また

void func(const boost::shared_ptr<baseclass>& a)

于 2013-06-04T16:09:05.093 に答える
1

はい、うまくいきます。ここで聞くよりコンパイルした方が早かったんじゃないの?

shared_ptrshared_ptr<D>からへshared_ptr<B>D*暗黙的な変換を可能にするテンプレート化された変換コンストラクターを持っているB*

于 2013-06-04T16:10:06.467 に答える
1

私はとても驚いたでしょう。適切なタイプの左辺値を渡す必要があります。それが機能するには、クラスは基本クラスである必要がありますが、そうではありません。

注: 関数が ptr を値または const& で受け取る場合、他のルールが適用されます。

于 2013-06-04T16:11:00.933 に答える