ああ!
shared_ptr
ドキュメントでそれを見つけました。これはエイリアシングと呼ばれます ( C++0x の shared_ptr の改善のセクション III を参照してください)。
別のコンストラクター (または対応するreset
関数オーバーロード)を使用する必要がありました。
template<class Y> shared_ptr( shared_ptr<Y> const & r, T * p );
これは次のように機能します (最初に親に shared_ptr を構築する必要があります):
#include <boost/shared_ptr.hpp>
#include <iostream>
struct A {
A() : i_(13) {}
int i_;
};
struct B {
A a_;
~B() { std::cout << "B deleted" << std::endl; }
};
int
main() {
boost::shared_ptr<A> a;
{
boost::shared_ptr<B> b(new B);
a = boost::shared_ptr<A>(b, &b->a_);
std::cout << "ref count = " << a.use_count() << std::endl;
}
std::cout << "ref count = " << a.use_count() << std::endl;
std::cout << a->i_ << std::endl;
}