2012-11-13 15 views
6

私はドキュメントのエラーや頭痛からもっと苦しんでいるかどうかわかりません...メンバーにshared_ptrを作成するにはどうすればよいですか?

私がしたいことは、所有権を別のものと共有しますが、そのメンバーを参照するshared_ptrを作成することです。オブジェクト全体ではなくオブジェクトです。単純な例として、出発点... en.cppreference.comから

struct s 
{ 
    int a, b; 
}; 

shared_ptr<s> s1 (new s); // pointing to whole object 

、コンストラクタ(8)のshared_ptrの、

template< class Y > 
shared_ptr(const shared_ptr<Y>& r, T *ptr); 

記述が言及は、「rの所有情報を共有するのshared_ptrを構築...であるが、 ptrがr "で管理されているオブジェクトのメンバである典型的な使用例のように、無関係なアンマネージポインタptr ...を保持します。

だから... Tはちょうど間違ってそのコンストラクタのテンプレートから逃しましたか、何か不足していますか?実際、Yもそれが私にとって間違っているように見えます。だから、一般的に、そのコンストラクタは正しく記述されていますか?私は私が行うことができます願っています何

はこのような何か...

shared_ptr<int> s2 (s1, &(s1.get()->a)); 

s2ポイントメンバーaint)が、s1を持つオブジェクト全体の株式の所有権にあります。

これはまともですか?

+0

:あなたが投稿のコードが動作するはずです

、あなたものように、それは少し単純に書くことができますヒープに?つまり、単にs2の生ポインタを使用しないのはなぜですか? –

+0

@RC - 元のshared_ptrの割り当てが解除された場合、オブジェクト自体は、つまりs2がダングリングポインタにならないようにするためです。実世界の例では、s1とs2のスコープは同じではありません。 – Steve314

+0

はい、まったく正気です。また、 '.get()'は必要ありません。 – atzz

答えて

9

パラメータは、shared_ptr自体のテンプレートパラメータです。一方、Yパラメータは、その特定のshared_ptrコンストラクタのテンプレートパラメータです。このようなもの:

template< class T > 
class shared_ptr 
{ 
    template< class Y > 
    shared_ptr(const shared_ptr<Y>& r, T *ptr); 
} 

あなたが投稿したコードは、うまくできています。

+0

誰もが正しい - あなたは少し速くて勝つ。私は少し愚かな気がしています - 私は明らかに最近多くのテンプレートをやっていません。私はメンバーテンプレートについて完全に忘れていました。 – Steve314

4

文書は正しいです。

template<typename T> 
template<typename Y> 
shared_ptr<T>::shared_ptr(const shared_ptr<Y>& r, T *ptr); 

だからあなたの例ではTがあるintYsです:あなたは、これは、コンストラクタのクラス修飾宣言がある、すなわちクラステンプレートshared_ptr<T>のコンストラクタのドキュメントであることを忘れています。

2

Tは、クラスのテンプレートパラメータであり、コンストラクタのテンプレートパラメータではありません。そして、これは正確に以下のようになります:メンバへのポインタは、メンバの型を持っていなければなりません(この場合、Y)。たぶん私は何かが欠けていますが、なぜあなたが割り当てられていないメンバーのVARへのshared_ptrを望む

shared_ptr<int> s2 (s1, &s1->a); 
+0

なんらかの理由で、私は '&'の優先順位について決して確信しません。おそらく、私は常にチェックするのではなく、余分な括弧を追加するからです。 'get 'も意図的ではありましたが、私はmake-things-more-explicit reasonationalが意味を成さないとは思っていません。私は本当に私の頭痛を責めることに固執する必要があります。 – Steve314

関連する問題