Templateクラスでのshared_from_this

Templateクラスからenable_shared_from_this()を使用する場合の注意点


shared_from_this

enable_shared_from_thisshared_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_thispublicで継承する必要があります。


テンプレートクラスでの注意点

テンプレートを使用したクラスで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();}
};

おすすめ