std::make_shared で private コンストラクタを呼ぶには,関数内クラスと継承を利用すれば良い. class hoge { hoge(); // private ctor public: static std::shared_ptr<hoge> create() { // return std::make_shared<hoge>(); // こう書きたいが,コンパイルエラー // 代わりに関数内クラスを利用する struct impl : hoge { impl() : hoge() {} }; auto p = std::make_shared<impl>(); return std::move(p); } }; 継承ではなく包含を使うことも可能だし,関数内クラスではなくクラス内クラスを使うことも出来る. class hoge { hoge(); // privat