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

时间:2015-06-10 01:22:29

标签: c++ c++11 stl shared-ptr weak-ptr

我可以内联来回转换。

std::shared_ptr<sfg::Notebook> mNotebook = ...;
std::weak_ptr<sfg::Notebook> weakNotebook(mNotebook);
std::shared_ptr<sfg::Notebook> strongNotebook(weakNotebook);

当我尝试将其传递给方法时,我收到错误:

"No viable conversion between std::weak_ptr<sfg::Notebook> to std::shared_ptr<sfg::Notebook>."

我正在调用方法,方法如下:

onNotebookLeftClick(weakNotebook);

void onNotebookLeftClick(std::shared_ptr<sfg::Notebook> notebook) {
}

我正在使用OS X(10.10.2)。

1 个答案:

答案 0 :(得分:5)

您尝试使用的shared_ptr constructorexplicit

template< class Y >
explicit shared_ptr( const std::weak_ptr<Y>& r );

你的第一个例子

std::shared_ptr<sfg::Notebook> strongNotebook(weakNotebook);

有效,因为您正在使用直接初始化,它适用于explicit构造函数。如果您使用复制初始化

,则会遇到同样的问题
std::shared_ptr<sfg::Notebook> strongNotebook = weakNotebook; // this will fail

要修复错误,请执行以下操作之一

onNotebookLeftClick(std::shared_ptr<sfg::Notebook>{weakNotebook});

onNotebookLeftClick(weakNotebook.lock());

请注意,这两种方法之间存在差异。如果weak_ptrexpired,则第一个解决方案会抛出std::bad_weak_ptr,而第二个选项会在这种情况下构建一个空shared_ptr