cpp referenceはshared_from_thisとprivate継承
class Good : std::enable_shared_from_this<Good>
{
public: std::shared_ptr<Good> getptr() { return shared_from_this(); }
};
...
auto good = std::make_shared<Good>();
good->getptr();
しかし、これは、Visual Studioで動作しません(微調整)std::enable_shared_from_this
を使用する方法のこの例を持っている2015(エンタープライズ、バージョン14.0.25123.00アップデート2)、すなわちstd::bad_weak_ptr
例外がスローされます。
は(cpp referenceまたはMicrosoftは異なるものも含めて)他の例を見ると、私は、彼らが代わりにprivate
1のpublic
継承を使用することに気づきました。 public
継承を使用すると、実際には私の問題が解決されます(std::bad_weak_ptr
はなくなりましたが、代わりに有効なshared_ptr
)。
Cppの参考文献には、std::enable_shared_from_this
から公に継承しなければならないと言われていないので、どこにエラーがありますか? Visual Studioの動作が間違っていますか(private
継承を使用しているときに可視性の問題があると思われます)、またはこの制限についてcppの参照に失敗しましたか?
PS:make_shared<good>()
またはshared_ptr<Good>(new Good)
は違いがありません。
PSS:どちらのバージョンもうまくコンパイルされますが、私的なものだけではうまく動作せず、これは非常に厄介な種類のバグです。
編集:struct
からclass
に変更されました。その例ではCpp参照は実際に公開の継承を使用しています。 まだパブリックでなければならないという言葉はありません。それは実際にそこに記載されている、私は慎重に読むことを学ばなければならない。ありがとう@Angew。
可能な重複します(http:// stackoverflowの.com/questions/27697973/shared-from-this-causing-bad-weak-ptr) –
@πάνταῥεother他の質問には根本的な原因がありません –
@PiotrSkotnicki私はそれを打つことはできませんでした。 –