'论点':从'Foo * const'到'IUnknown *'的模糊转换

时间:2009-12-09 11:38:45

标签: com atl

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

我做错了什么?

1 个答案:

答案 0 :(得分:9)

IPluginIEventSubscriber都来自IUnknown,因此C ++无法自行决定将IUnknown中的哪一个隐式投射。你需要明确告诉C ++你想要哪一个。有两个选项:调用GetUnknown()(在每个声明了COM映射的类中都可用):

pOther->MethodTakingIUnknown(GetUnknown());

或将this显式转换为其中一个基接口:

pOther->MethodTakingIUnknown( static_cast<IPlugin*>( this ) );

在这种情况下,您投射到哪个基本界面并不重要 - 只需投射到任何基础界面。只有当你实现IUnknown::QueryInterface()每次始终强制转换到同一个基础时才重要。