DCu*_*rro 2 c++ stl shared-ptr weak-ptr c++11
我可以内联来回转换.
std::shared_ptr<sfg::Notebook> mNotebook = ...;
std::weak_ptr<sfg::Notebook> weakNotebook(mNotebook);
std::shared_ptr<sfg::Notebook> strongNotebook(weakNotebook);
Run Code Online (Sandbox Code Playgroud)
当我尝试将其传递给方法时,我收到错误:
"No viable conversion between std::weak_ptr<sfg::Notebook> to std::shared_ptr<sfg::Notebook>."
Run Code Online (Sandbox Code Playgroud)
我正常调用方法,方法如下:
onNotebookLeftClick(weakNotebook);
void onNotebookLeftClick(std::shared_ptr<sfg::Notebook> notebook) {
}
Run Code Online (Sandbox Code Playgroud)
我正在使用OS X(10.10.2).
您尝试使用的shared_ptr
构造函数是explicit
.
template< class Y >
explicit shared_ptr( const std::weak_ptr<Y>& r );
Run Code Online (Sandbox Code Playgroud)
你的第一个例子
std::shared_ptr<sfg::Notebook> strongNotebook(weakNotebook);
Run Code Online (Sandbox Code Playgroud)
因为您正在使用直接初始化,它可以与explicit
构造函数一起使用.如果您使用复制初始化,则会遇到同样的问题
std::shared_ptr<sfg::Notebook> strongNotebook = weakNotebook; // this will fail
Run Code Online (Sandbox Code Playgroud)
要修复错误,请执行以下操作之一
onNotebookLeftClick(std::shared_ptr<sfg::Notebook>{weakNotebook});
Run Code Online (Sandbox Code Playgroud)
要么
onNotebookLeftClick(weakNotebook.lock());
Run Code Online (Sandbox Code Playgroud)
请注意,这两种方法之间存在差异.如果weak_ptr
有expired
,则第一个解决方案将抛出std::bad_weak_ptr
,而第二个选项将shared_ptr
在该情况下构造为空.
归档时间: |
|
查看次数: |
817 次 |
最近记录: |