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

Rog*_*mbe 8 com atl

我有一个ATL课程:

class Foo :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<Foo, &CLSID_Foo>,
    public IPlugin,
    public IEventSubscriber
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

我需要将它传递给另一个对象,如下所示:

pOther->MethodTakingIUnknown(this);
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我收到以下错误消息:

error C2594: 'argument' : ambiguous conversions from 'Foo *const' to 'IUnknown *'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

sha*_*oth 9

双方IPluginIEventSubscriber都源于IUnknown所以C++不能自行决定的其中一个IUnknowns到投含蓄.你需要明确告诉C++你想要哪一个.有两个选项:要么调用GetUnknown()(在每个声明了COM映射的类中都可用):

pOther->MethodTakingIUnknown(GetUnknown());
Run Code Online (Sandbox Code Playgroud)

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

pOther->MethodTakingIUnknown( static_cast<IPlugin*>( this ) );
Run Code Online (Sandbox Code Playgroud)

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