2012-02-21 102 views
2

目前CComPtr::operator=是使用具有以下特征的辅助功能AtlComPtrAssign()实施AtlComPtrAssign有什么需要?</p> <pre><code>IUnknown* AtlComPtrAssign(IUnknown** pp, IUnknown* lp); </code></pre> <p>,并已被称为像这样:

T* operator=(const CComPtr<T>& lp) throw() 
{ 
    if(*this!=lp) { 
     return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp)); 
    } 
    return *this; 
} 

,如果我尝试存储使用导致问题CComPtrT是一个实现多个COM接口的类 - 转换为IUnknown*变得模糊不清,编译失败。

我的问题是 - 有什么需要使用这样的辅助函数,具有这些参数?为什么不这样做:

template<classT> 
T* AtlComPtrAssign(T** pp, T* lp); 

并调用它为任何合理的T?有什么需要这个upcast到IUnknown*,然后反向downcast到T*?用于但是CComPtr <>

+0

为什么'operator ='返回'T *'而不是'CComPtr &'? – interjay 2012-02-21 10:16:25

回答

1
  1. 模板参数是一个接口,而不是一个完整的类,因此你不能有多个IUnknown那儿,总是只有一个。
  2. 我会假设整个AtlComPtrAssign的历史是,在早期的功能可选地驻留在ATL.DLL,除非选择某些选项,宁愿静态链接到ATL。

我相信在早期版本的ATL中,您也可以使用CComPtr。我记得使用它,它非常方便 - 您可以同时使用自动引用计数和原始类指针(与接口指针相反),但是在某些时候,由于编译器错误,此类使用不再可用,并且需要自定义模板类而不是标准的CComPtr来实现相同的功能。

相关问题