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给调用者.
| 归档时间: |
|
| 查看次数: |
5136 次 |
| 最近记录: |