В настоящее время 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
с T
, являющимся классом, реализующим более одного интерфейса COM - преобразование в IUnknown*
становится неоднозначным, и компиляция завершается неудачей.
Мой вопрос - зачем использовать такую вспомогательную функцию, которая имеет именно эти параметры? Почему бы не сделать так:
template<classT>
T* AtlComPtrAssign( T** pp, T* lp);
и назовите это для любого разумного T
? Зачем нужен этот подъем до IUnknown*
, а затем обратный переход до T*
?