C2594:COM对象的模糊转换

时间:2014-11-03 15:27:42

标签: c++ com atl

我有一个ATL类,我正在尝试为它实现的每个接口实现一个强制转换操作符。该类是一个代表真实对象的模拟。

class CMock :
  public IDispatchImpl<Interface1 ...>
  public IDispatchImpl<Interface2 ...>

ATL COM Mapping如下:

BEGIN_COM_MAP(CMock)
  // Resolve ambiguity by exposing Interface1 through Interface2
  COM_INTERFACE_ENTRY2(Interface1, Interface2)
  COM_INTERFACE_ENTRY(Interface)
END_COM_MAP()

然后我重载了Interface1*Interface2*

的强制转换操作符
operator Interface1* () 
{ 
  Interface1* pInterface1;
  if(FAILED(this->QueryInterface(IID_Interface1, reinterpret_cast<void**>(&pInterface1)))
     return nullptr;
  return pInterface1;
}
// Repeat for IInterface2

尽管有重载的强制转换操作符,但在尝试强制转换为通过另一个接口暴露的任何接口时,我仍然会出现模糊错误。

error C2594: 'argument' : ambiguous conversions from 'CMock *' to 'Interface1 *'

int main()
{
   CComPtr<CMock> mock = new CComObject<CMock>();

   Interface1* pInterface1 = mock; // Error C2594
   Interface2* pInterface2 = mock; // compiles OK.
   return 0;
}

我理解为什么模糊的转换存在,但我很困惑为什么编译器甚至在定义自定义转换运算符时都会查看它们。反正有没有定义转换运算符,编译器会忽略其他转换的可能性?

1 个答案:

答案 0 :(得分:1)

您定义的强制转换操作符在此处没有帮助,因为您在CMock类上定义它,而问题发生在CComPtr<CMock>上,CMock*CMock*之上的包装器。所以操作员没有帮助,但它不需要帮助。

在您的代码段中删除其他问题(其中有一些),您最终需要以下内容:

如果您有一个原始指针,例如CComObject<CMock>*Interface1* pInterface1 = (Interface*) (CMock*) mock; ,那么您可以使用C ++强制转换操作符进行强制转换,例如

QueryInterface

如果您有对象的界面指针而不是本机指针,那么您可以使用CComQIPtrCComQIPtr<Interface1> pInterface1 = mock; // or, "... = (Interface2*) mock;" // to possibly resolve `IUnknown*` ambiguities 来获取界面。

{{1}}