对于方法调用,没有可行的转换std :: weak_ptr到std :: shared_ptr

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).

Pra*_*ian 6

您尝试使用的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_ptrexpired,则第一个解决方案将抛出std::bad_weak_ptr,而第二个选项将shared_ptr在该情况下构造为空.