Difference between CComPtr and CComQIPtr
2006-12-17 21:22
267 查看
可能每个人学习 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 相同.
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 相同.
相关文章推荐
- [OS][Multithread]Difference between Semophore and Mutex
- 异步与非阻塞的区别(Difference between asynchronous and non-blocking)
- (ZT)What’s the Difference Between Chromium and Chrome?
- The difference between Post and Get
- The difference between Git and SVN
- The difference between GetDC and GetWindowDC
- In PHP5, what is the difference between using self and $this? When is each appropriate?
- Difference between a SOAP message and a WSDL?
- 进程与线程的区别 What is the difference between process and thread
- What's the Difference between the frame and the bounds?
- Difference between menu item types; Display, Output and Action in Dynamics Ax
- Difference between char *str=“STRING” and char str[] = “STRING”
- the difference between substr and substrb
- Difference between Composition and Aggregation
- What is the Differences Between Sleep/Standby and Hibernate
- [Immutable.js] Differences between the Immutable.js Map() and List()
- 10 Major Differences Between C And C++
- The difference between Hotkey, accelerator, and composite key.
- the difference between Activity.managedQuery and ContentResolver.query
- What is the difference between arguments and parameters?