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

No viable conversion std::weak_ptr to std::shared_ptr for method call

我可以内联来回转换。

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

您尝试使用的 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