方法调用没有可行的 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
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
。
我可以内联来回转换。
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
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
。