Templateクラスでのshared_from_this
Templateクラスからenable_shared_from_this()
を使用する場合の注意点
shared_from_this
enable_shared_from_this
はshared_ptr<T>
で管理されているオブジェクトから自身を管理するshared_ptr
の安全な共有方法を提供してくれます (参照)
例えば、以下のようなコードは新たな独立したshared_ptr
を作成してしまうため問題です
class SharedObj : public enable_shared_from_this<SharedObj> {
public:
shared_ptr<SharedObj> BadShare() {
// 悪い共有方法
return shared_ptr<SharedObj>(this);
}
};
そこでenable_shared_from_this
を使用して次のように記述します
class GoodShared : public enable_shared_from_this<GoodShared> {
public:
shared_ptr<GoodShared> Getptr() { return shared_from_this(); }
};
enable_shared_from_this
はpublic
で継承する必要があります。
テンプレートクラスでの注意点
テンプレートを使用したクラスでshared_from_this
を呼び出す際に、
template <class T>
class CTemplate : public enable_shared_from_this<CTemplate<T>> {
public:
shared_ptr<CTemplate<T>> Getptr() { return shared_from_this();}
};
と記述すると下記のようなエラーとなります
error: use of undeclared identifier 'shared_from_this'
これはshared_from_this
をベースクラスのメンバとしてコンパイラが認識しないことが問題のようで (参照)、以下のようにthis->shared_from_this()
を記述する必要があるそうです
template <class T>
class CTemplate : public enable_shared_from_this<CTemplate<T>> {
public:
shared_ptr<CTemplate<T>> Getptr() { return this->shared_from_this();}
};
最近のコメント