【发布时间】: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;
}
我理解为什么会有模棱两可的转换,但我很困惑为什么编译器在我定义自定义转换运算符时甚至会查看这些转换。无论如何定义强制转换运算符以便编译器将忽略其他转换可能性?
【问题讨论】: