【问题标题】:'argument' : ambiguous conversions from 'Foo *const ' to 'IUnknown *''argument' : 从 'Foo *const' 到 'IUnknown *' 的模棱两可的转换
【发布时间】:2010-12-24 19:20:32
【问题描述】:

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

我做错了什么?

【问题讨论】:

    标签: com atl


    【解决方案1】:

    IPluginIEventSubscriber 都派生自 IUnknown,因此 C++ 无法自行决定隐式转换为 IUnknowns 中的哪一个。你需要明确地告诉 C++ 你想要哪一个。有两种选择:要么调用GetUnknown()(在每个声明了 COM 映射的类中都可用):

    pOther->MethodTakingIUnknown(GetUnknown());
    

    或将this 显式转换为基本接口之一:

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

    在这种情况下,您投射到哪个基本接口并不重要 - 只需投射到任何一个即可。仅当您实现 IUnknown::QueryInterface() 以每次都一致地转换为相同的基数时才重要。

    【讨论】:

    • +1:比我的答案更好,因为它也涵盖了非 ATL 案例。
    猜你喜欢
    • 1970-01-01
    • 2011-01-18
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    相关资源
    最近更新 更多