我可以内联来回转换。
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)。
答案 0 :(得分:5)
您尝试使用的shared_ptr
constructor是explicit
。
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_ptr
有expired
,则第一个解决方案会抛出std::bad_weak_ptr
,而第二个选项会在这种情况下构建一个空shared_ptr
。