当前,CComPtr::operator=使用具有以下签名的辅助函数AtlComPtrAssign()实现:IUnknown* AtlComPtrAssign( IUnknown** pp, IUnknown* lp);并且必须这样称呼:T* operator=( const CComPtr<T>& lp) throw(){ if(*this!=lp) { return static_cast<T*>(AtlComPtrAssign((IUnknown**)&p, lp)); } return *this;}如果我尝试将使用CComPtr存储为实现多个COM接口(interface)的类,这会导致问题-到T的转换变得模棱两可,并且编译失败。我的问题是-使用具有这些参数的辅助函数有什么需求?为什么不这样做:template<classT>T* AtlComPtrAssign( T** pp, T* lp);并为任何合理的IUnknown*调用它?将此转换为T,然后反向转换为IUnknown*,需要什么? 最佳答案 CComPtr 的模板参数是一个接口(interface),而不是完整的类,因此您不能在其中有多个IUnknown,总是只有一个。 我想AtlComPtrAssign的整个历史是,在早期,该功能可选地驻留在ATL.DLL中,除非选择某些选项,否则将首选静态链接到ATL。 我相信,使用ATL的早期版本,您也可以将CComPtr与类一起使用。我记得使用它,它非常方便-您可以同时具有自动引用计数和原始类指针(而不是接口(interface)指针),但是在某些时候,由于编译器错误,这种使用不再可用,并且需要自定义模板类而不是标准CComPtr来实现相同的功能。关于c++ - AtlComPtrAssign有什么需求?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9375526/
10-11 22:54