Difference between CComPtr and CComQIPtr

本文探讨了在ATL中使用CComQIPtr处理IUnknown接口时遇到的编译问题,并解释了为何CComQIPtr不能直接用于IUnknown。文章还讨论了如何通过特化版本解决这一问题。

可能每个人学习 ATL 的时候都要区分 CComPtr 和 CComQIPtr 的不同.
CComQIPtr 是 CComPtr 的超集, 但 CComQIPtr 不能用于 IUnknown. 为什么不能用.

#include <atlbase.h>
void main(){CComQIPtr<IUnknown> spunk;}

果然, 编译错误. 原来错误的原因只是 CComQIPtr 定义了  

CComQIPtr(T* lp){..}
CComQIPtr(IUnknown* lp){..}

两个函数, 当 T = IUnknown 的时候, 函数重定义了. 还有另两个函数有这样的冲突.
查看 atlbase.h, 可以看到 CComQIPtr 还有一个特化的版本:

template<>
class CComQIPtr<IUnknown, &IID_IUnknown>
{..}

这个版本可以让这样的代码通过编译:

CComQIPtr <IUnknown, &IID_IUnknown> spunk;

CComQIPtr<IUnknown> sp;

为什么不能通过编译呢? CComQIPtr<IUnknown> 取了默认的模板参数, 成为 CComQIPtr<IUnknown, &__uuidof(IUnknown)>. __uuidof 这个操作符返回一个类型:

struct __s_GUID _GUID_00000000_0000_0000_c000_000000000046

很显然, 编译器不认为它和 IID_IUnknown 相同.
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值