簡體   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