将void*转换为某种类型的shared_ptr

Convert void * to shared_ptr of a type

本文关键字:类型 shared ptr 种类 void 转换      更新时间:2023-10-16

在下面的代码中,我试图将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