CComPtr与CComQIPtr的区别

首先CComQIPtrCComPtr的子类,所以CComQIPtr有更多功能。

CComQIPtr多一个IID,模板里需要这个参数,但这个参数是默认参数

下面两种形式都可以

CComQIPtr<IA,IID_IA> spQIIA;

CComQIPtr<IA > spQIIA;

CComPtr则要

CComPtr<IA > spIA;

 

CComPtr较简单,但它的代价就是更少的兼容性,下面代码来说明:

假设对象ObjA有接口IAIB当然还有IUnknown

*         代码1

CComPtr<IA > spIA2;

spIA= spIA2; //成功

 

*         代码2

CComPtr<IB> spIB;

spIA= spIB; //成功,因为CComPtr里有这样的操作符,因为一开始就没有IID,所以如需要IID则会采用__uuidof来获取,如果__uuidof获取失败,则会编译失败

template <typename Q>

T* operator=(__in const CComPtr<Q>& lp) throw(){。。。}

 

*         代码3

IB * pB;

IUnknown * pUnK;

spIA= spIB;              //失败,没有这个操作符

spIA= pUnK;             //失败,没有这个操作符

spQIIA = spIB;          //成功

spQIIA = pUnK;        //成功

因为CComQIPtr里有    T* operator=(__in_opt IUnknown* lp) throw()

 

*         代码4

CComQIPtr<IUnknown, &IID_IUnknown> bbb;

CComQIPtr<IUnknown> bbb;

第二行代码会编译错误,因为第二行编译没有采用特化,采用一般化的形式

    CComQIPtr(__in_opt T* lp)

    CComQIPtr(__in_opt IUnknown* lp)

由于T= IUnknown,所以以会导致编译错误,

第一行则采用了特化,修改了构造函数

template<>

class CComQIPtr<IUnknown, &IID_IUnknown> : public CComPtr<IUnknown>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值