[英]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_ptr
已expired
,則第一個解決方案將拋出std::bad_weak_ptr
,而第二個選項將在這種情況下構造一個空的shared_ptr
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.