6

ドキュメントのエラーや頭痛に苦しんでいるのかどうかわからないので...

私がやりたいのは、所有権を別の人と共有するが、オブジェクト全体ではなくオブジェクトのメンバーを参照するshared_ptrを作成することです。簡単な例、出発点...

struct s
{
  int a, b;
};

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

en.cppreference.comから、shared_ptrのコンストラクター(8)は...

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

説明には、「所有権情報をrと共有するが、ptrがrによって管理されるオブジェクトのメンバーである一般的なユースケースのように、無関係で管理されていないポインターptrを保持するshared_ptrを構築する」と記載されています。

だから...Tそのコンストラクターのテンプレートから誤って見落とされたのですか、それとも何かが足りないのですか?実際、Yは私にも間違っているように見えますが、一般的に、そのコンストラクターは正しく記述されていますか?

私ができることを望んでいるのはこのようなものです...

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

s2aメンバー(an )を指しintますが、オブジェクト全体の所有権を。と共有しs1ます。

それは正気ですか?

4

3 に答える 3

9

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

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

あなたが投稿したサンプルコードに関しては、それは私には問題ないように見えます。

于 2012-11-13T12:10:53.600 に答える
4

ドキュメントは正しいです。これがクラステンプレート上のコンストラクターのドキュメントであることを忘れています。shared_ptr<T>つまり、コンストラクターのクラス修飾宣言は次のとおりです。

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

したがって、あなたの例Tでは、はでintあり、Yですs

于 2012-11-13T12:13:14.387 に答える
2

Tコンストラクターではなく、クラスのテンプレートパラメーターです。そして、これはまさに必要なことです。メンバーへのポインターは、メンバーのタイプを持ち、含まれているオブジェクトのタイプ(Yこの場合は、型消去を参照)を忘れる/消去する必要があります。

投稿したコードは機能するはずです。少し簡単に次のように書くこともできます。

shared_ptr<int> s2 (s1, &s1->a);
于 2012-11-13T12:13:16.880 に答える