2009-12-09 16 views
7

Tengo una clase ATL 'IUnknown *':'argumento': conversiones ambiguas de 'Foo * const' a

class Foo : 
    public CComObjectRootEx<CComMultiThreadModel>, 
    public CComCoClass<Foo, &CLSID_Foo>, 
    public IPlugin, 
    public IEventSubscriber 
{ 
    // ... 
}; 

que necesito para pasar a otro objeto, como esto:

pOther->MethodTakingIUnknown(this); 

Cuando hago esto, me sale el siguiente mensaje de error:

error C2594: 'argument' : ambiguous conversions from 'Foo *const' to 'IUnknown *' 

¿Qué estoy haciendo mal?

Respuesta

9

Tanto IPlugin y IEventSubscriber se derivan de IUnknown y así C++ no puede decidir por sí mismo cuál de IUnknown s para echar a implícitamente. Necesitas decirle explícitamente a C++ cuál quieres. Hay dos opciones: o bien llamar GetUnknown() (está disponible en todas las clases que tienen un mapa COM declarado):

pOther->MethodTakingIUnknown(GetUnknown()); 

o explícitamente fundido this a uno de los interfaces base:

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

En esta misma En caso de que no importe a qué interfaz de base se envía, solo se envía a cualquiera. Solo importa cuando implemente IUnknown::QueryInterface() para realizar el codeo sistemáticamente a la misma base cada vez.

+0

+1: Mejor respuesta que la mía, porque también cubre el caso que no es de ATL. –

+0

Para ser claros, 'GetUnknown()' es algo de ATL. – zneak

Cuestiones relacionadas