我有一个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;
}
我理解为什么模糊的转换存在,但我很困惑为什么编译器甚至在定义自定义转换运算符时都会查看它们。反正有没有定义转换运算符,编译器会忽略其他转换的可能性?
答案 0 :(得分:1)
您定义的强制转换操作符在此处没有帮助,因为您在CMock
类上定义它,而问题发生在CComPtr<CMock>
上,CMock*
是CMock*
之上的包装器。所以操作员没有帮助,但它不需要帮助。
在您的代码段中删除其他问题(其中有一些),您最终需要以下内容:
如果您有一个原始指针,例如CComObject<CMock>*
或Interface1* pInterface1 = (Interface*) (CMock*) mock;
,那么您可以使用C ++强制转换操作符进行强制转换,例如
QueryInterface
如果您有对象的界面指针而不是本机指针,那么您可以使用CComQIPtr
或CComQIPtr<Interface1> pInterface1 = mock; // or, "... = (Interface2*) mock;"
// to possibly resolve `IUnknown*` ambiguities
来获取界面。
{{1}}