【问题标题】:C2594 : Ambiguous Conversion with COM ObjectC2594:COM 对象的模棱两可的转换
【发布时间】:2014-12-30 07:04:47
【问题描述】:

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

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

尽管有重载的强制转换运算符,但在尝试强制转换到通过另一个公开的任何接口时,我仍然遇到一个模棱两可的错误。

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;
}

我理解为什么会有模棱两可的转换,但我很困惑为什么编译器在我定义自定义转换运算符时甚至会查看这些转换。无论如何定义强制转换运算符以便编译器将忽略其他转换可能性?

【问题讨论】:

    标签: c++ com atl


    【解决方案1】:

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

    跳过您的 sn-ps 中的其他问题(其中有一些),您最终需要以下内容:

    如果您有一个原始指针,例如 CMock*CComObject&lt;CMock&gt;*,那么您可以使用 C++ 转换运算符进行转换,例如

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

    如果您有对象的接口指针,而不是本机指针,那么您可以使用QueryInterfaceCComQIPtr 获取您的接口。

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

    【讨论】:

    • 在这种情况下,那些 C 风格的演员阵容太可怕了。有时它们保证调试时间很长。
    • @sharptooth:它们非常清晰易读。从来没有给我任何麻烦。然后当它们是静态转换时,编译器会在转换不可用时发出错误。
    • 当然,如果我复制粘贴然后对某些代码进行编辑不足,我会很高兴收到错误消息。 C 风格的转换只会编译。
    • (CMock*) mock; 在转换不可用时不会编译。 static_cast&lt;CMock*&gt;(mock) 太大而无法阅读。归根结底,C 风格转换仍然占主导地位。
    • (CMock*) 不会编译,但 (Interface*) 可以在不应该编译的时候编译。顺便说一句,您首先不需要(CMock*) - 只需访问智能指针的.p,然后将其传递给static_cast&lt;Interface*&gt;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2015-11-19
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多