Programmer
Programmer

Reputation: 8697

Convert void * to shared_ptr of a type

In below code I am trying to convert a void* to a shared_ptr of a type:

#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());
}

But I get below compilation error:

$ 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" );

How can I convert a void pointer to a shared pointer of a type?

Upvotes: 2

Views: 1862

Answers (1)

Jarod42
Jarod42

Reputation: 217135

Assuming you cannot change declaration of PrintA, your PrintA definition should look like:

void PrintA(void *aptr)
{
    A* a1 = reinterpret_cast<A*>(aptr);
    a1->Show();
}

as you pass to it a pointer. as you don't reclaim ownership, no need to create std::shared_ptr. If you need to share ownership, you have to modify A to allow to use share_from_this.

Upvotes: 5

Related Questions