c++ - C2594 : Ambiguous Conversion with COM Object

标签 c++ com atl

我有一个 ATL 类,我试图为它实现的每个接口(interface)实现一个转换运算符。该类是代表真实对象的模拟。

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

ATL COM 映射如下:

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

尽管重载了转换运算符,但在尝试转换到通过另一个接口(interface)公开的任何接口(interface)时,我仍然遇到不明确的错误。

错误 C2594:“参数”:从“CMock *”到“Interface1 *”的不明确转换

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

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

我理解为什么会出现不明确的转换,但我很困惑为什么编译器在我定义自定义转换运算符时还要查看这些转换。有没有办法定义转换运算符,使编译器忽略其他转换可能性?

最佳答案

您定义的转换运算符在这里没有帮助,因为您是在 CMock 上定义它的类,而问题发生在 CComPtr<CMock> ,它是 CMock* 之上的包装器.所以运营商没有帮助,但它不需要帮助。

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

如果你有一个裸指针,比如CMock*CComObject<CMock>*然后您可以使用 C++ 转换运算符进行转换,例如

Interface1* pInterface1 = (Interface*) (CMock*) mock;

如果您有对象的接口(interface)指针,而不是 native 指针,那么您可以使用QueryInterface 获取接口(interface)。或 CComQIPtr .

CComQIPtr<Interface1> pInterface1 = mock; // or, "... = (Interface2*) mock;"
                                 // to possibly resolve `IUnknown*` ambiguities

关于c++ - C2594 : Ambiguous Conversion with COM Object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26717388/

相关文章:

c++ - COM 事件处理的最快方式(在性能方面)

visual-c++ - COM 中 CComPtr 优于 CComQIPtr 的用途是什么?

c++ - 未收到 TVN_SELCHANGING

c++ - 在控制台应用程序中使用 COM 方法

c++ - 使用 std::unique_ptr 管理 COM 对象

visual-studio-2008 - .rgs文件中的注释的语法是什么

c++ - 具有成员 std::vector 的移动语义

c++ - c 中 undefined reference ...我做错了什么?

c++ - 判断是否有为特定类型的参数定义的重载函数

c++ - OpenGL:如何只清除屏幕的一部分?