c++ - 将 void * 转换为类型的 shared_ptr
问题描述
在下面的代码中,我试图将一个 void* 转换为一个类型的 shared_ptr:
#include <iostream>
#include <memory>
class A
{
public:
A(){l=0;}
int l;
void Show() { std::cout << l << "\n";}
};
void PrintA(void *aptr)
{
std::shared_ptr<A> a1;
a1.reset(aptr);
a1->Show();
}
int main()
{
std::shared_ptr<A> a(new A());
PrintA(a.get());
}
但我得到以下编译错误:
$ c++ -std=c++14 try20.cpp
In file included from C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/shared_ptr.h:52:0,
from C:/tools/mingw64/x86_64-w64-mingw32/include/c++/memory:82,
from try20.cpp:2:
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/shared_ptr_base.h: In instantiation of 'std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Tp1*) [with _Tp1 = void; _Tp = A; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]':
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/shared_ptr_base.h:1023:4: required from 'void std::__shared_ptr<_Tp, _Lp>::reset(_Tp1*) [with _Tp1 = void; _Tp = A; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]'
try20.cpp:14:14: required from here
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/shared_ptr_base.h:871:39: error: invalid conversion from 'void*' to 'A*' [-fpermissive]
: _M_ptr(__p), _M_refcount(__p)
^
C:/tools/mingw64/x86_64-w64-mingw32/include/c++/bits/shared_ptr_base.h:874:4: error: static assertion failed: incomplete type
static_assert( !is_void<_Tp1>::value, "incomplete type" );
如何将 void 指针转换为类型的共享指针?
解决方案
假设您不能更改 的声明PrintA
,您的PrintA
定义应如下所示:
void PrintA(void *aptr)
{
A* a1 = reinterpret_cast<A*>(aptr);
a1->Show();
}
当你传递给它一个指针。由于您不收回所有权,因此无需创建std::shared_ptr
. 如果您需要共享所有权,则必须修改A
以允许使用share_from_this
.
推荐阅读
- python - 通过拆分每列并迭代python pandas DataFrame中的许多列来插入新列
- javascript - 如何在反应中使用来自另一个文件的状态
- python - Python中的结构化流处理
- google-cloud-platform - 使用提醒政策的 GKE 提醒
- javascript - 反应本机构建错误:尝试调用虚拟方法'boolean com.facebook.react.uimanager.FabricViewStateManager.hasStateWrappper()
- ios - GCDWebServer:如何更改服务器上的文件权限以进行 WebDAV 操作?(iOS)
- java - 在将 Object[] 转换为 String[] 时,我正在为以下代码获取 java.lang.ArrayStoreException
- python - 递归函数在调整时调用自己的次数不同,即使两个函数都做同样的事情并产生相同的结果
- javascript - 输入函数时如何在 React 中禁用按钮
- android - 更新到 com.android.tools.build:gradle:4.2.1 后生成错误