2012-02-21 57 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來實現相同的功能。

相關問題