1

我得到了一个结构和一个函数,如下所示:

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


void func1(std::unique_ptr<MYOVERLAPPED> pBuf)
{
    //...
};

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

我已经尝试过以下内容:Try1:

std::unique_ptr<OVERLAPPED> pOver(//....)
HandleAcceptIndication(std::move(pOver));

错误:错误 1 ​​错误 C2440:“正在初始化”:无法从“_OVERLAPPED **”转换为“MYOVERLAPPED *”

尝试2:

HandleAcceptIndication(new ACCEPT_OVERLAPPED);

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

任何人都知道我如何可以将 OVERLAPPED 的这个转换指针传递给 MYOVERLAPPED 到函数,以及为什么 Try2 也不起作用,因为我随便使用std::unique_ptr<MYOVERLAPPED> pO(new MYOVERLAPPED) which 确实有效......?

4

3 回答 3

11

虽然您不能直接从std::unique_ptr<base>to转换,但编写一个安全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]
}

基本思想是我们需要从 中提取指针std::unique_ptr并将其放在 [1] 中。我们不能dynamic_cast直接尝试,好像失败了,ptr会释放所有权,并且内存会泄漏。然后我们尝试执行dynamic_cast从本地指针到请求类型的指针的 [2],并将所有权传递给r结果唯一指针。如果dynamic_cast失败,则为r空,我们需要将内存的所有权归还给原始std::unique_ptr[3],以便调用代码决定如何处理它。然后我们将转换 std::unique_ptr后的结果返回给 [4] 中的调用者。

于 2011-09-09T16:30:54.420 回答
2

这不起作用,因为您试图在继承层次结构中以错误的方式进行转换。您正在尝试从 Base* 隐式转换为 Derived* 。

于 2011-09-09T15:23:14.287 回答
0

unique_ptr<A>并且unique_ptr<B>是不相关的类型。A*除非和之间存在隐式转换(感谢 UncleBens),否则您无法在它们之间进行转换B*,在这种情况下并非如此。此外,您不应该使用不是您要转换的子类的实例来降低继承层次结构。在这种情况下,您尝试将 a 强制OVERLAPPED转换MYOVERLAPPED为无效强制转换,因为 aOVERLAPPED不是 a MYOVERLAPPED。这就是为什么您首先无法在unique_ptr类型之间进行转换的原因。

如果你只是想传递一个unique_ptrto func1,你可以这样做:

func1(shared_ptr<MYOVERLAPPED>(new MYOVERLAPPED));

此外,通过将 a 传递unique_ptr给函数,原始指针中的指针被设置为 NULL。shared_ptr如果您不创建unique_ptr临时对象并将其传递给函数并且您需要稍后使用相同的实例,请考虑使用引用或s。

于 2011-09-09T15:24:45.500 回答