将std :: unique_ptr作为参数传递给函数

Inc*_*bus 1 c++ parameters compiler-errors function unique-ptr

我有一个结构和功能如下:

struct MYOVERLAPPED : public OVERLAPPED
{
    //...
};


void func1(std::unique_ptr<MYOVERLAPPED> pBuf)
{
    //...
};
Run Code Online (Sandbox Code Playgroud)

我正在获取一个指向MYOVERLAPPED的指针,我希望将其传递给func1函数.我遇到的问题是,无论我尝试什么,我都会收到以下错误:

我尝试过的是以下内容:Try1:

std::unique_ptr<OVERLAPPED> pOver(//....)
HandleAcceptIndication(std::move(pOver));
Run Code Online (Sandbox Code Playgroud)

错误:错误1错误C2440:'初始化':无法从'_OVERLAPPED**'转换为'MYOVERLAPPED*'

Try2:

HandleAcceptIndication(new ACCEPT_OVERLAPPED);
Run Code Online (Sandbox Code Playgroud)

错误1错误C2664:'HandleAcceptIndication':无法将参数1从'MYOVERLAPPED*'转换为'std :: unique_ptr <_Ty>'

任何人都知道我怎么能把这个OVERLAPPED的指针指针传递给MYOVERLAPPED函数以及为什么Try2不起作用,因为我随便使用std::unique_ptr<MYOVERLAPPED> pO(new MYOVERLAPPED) 哪个工作......?

Dav*_*eas 11

虽然你不能从转换std::unique_ptr<base>std::unique_ptr<derived>直接,这不是太难写一个转换函数,这将是安全的(即不漏任何情况下的资源,只许成功,如果转换是有效的:

template <typename Dst, typename Src>
std::unique_ptr<Dst> unique_dynamic_cast( std::unique_ptr<Src>& ptr ) {
    Src * p = ptr.release();                             // [1]
    std::unique_ptr<Dst> r( dynamic_cast<Dst*>(p) );     // [2]
    if ( !r ) {
        ptr.reset( p );                                  // [3]
    }
    return r;                                            // [4]
}
Run Code Online (Sandbox Code Playgroud)

基本思想是我们需要从std::unique_ptr[1]中提取指针并将其放在一边.我们无法dynamic_cast直接尝试,如果失败,ptr将释放所有权,并且内存将被泄露.然后我们尝试dynamic_cast从指向所请求类型的指针的本地指针执行[2],并将所有权传递给r结果唯一指针.如果dynamic_cast失败,那么r将为null,我们需要将内存的所有权归还给原始std::unique_ptr[3],以便调用代码来决定如何处理它.然后我们在[4] 中将转换 返回std::unique_ptr给调用者.