我有一个 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/