我有一个ATL课程:
class Foo :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<Foo, &CLSID_Foo>,
public IPlugin,
public IEventSubscriber
{
// ...
};
我需要将它传递给另一个对象,如:
pOther->MethodTakingIUnknown(this);
当我这样做时,我收到以下错误消息:
error C2594: 'argument' : ambiguous conversions from 'Foo *const' to 'IUnknown *'
我做错了什么?
答案 0 :(得分:9)
IPlugin
和IEventSubscriber
都来自IUnknown
,因此C ++无法自行决定将IUnknown
中的哪一个隐式投射。你需要明确告诉C ++你想要哪一个。有两个选项:调用GetUnknown()
(在每个声明了COM映射的类中都可用):
pOther->MethodTakingIUnknown(GetUnknown());
或将this
显式转换为其中一个基接口:
pOther->MethodTakingIUnknown( static_cast<IPlugin*>( this ) );
在这种情况下,您投射到哪个基本界面并不重要 - 只需投射到任何基础界面。只有当你实现IUnknown::QueryInterface()
每次始终强制转换到同一个基础时才重要。