繁体   English   中英

没有可行的将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构造函数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_ptrexpired ,则第一个解决方案将抛出std::bad_weak_ptr ,而第二个选项将在这种情况下构造一个空的shared_ptr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM