com - optica - situaciones ambiguas ejemplos
''argumento'': conversiones ambiguas de ''Foo*const'' a ''IUnknown*'' (1)
Tengo una clase de ATL:
class Foo :
public CComObjectRootEx<CComMultiThreadModel>,
public CComCoClass<Foo, &CLSID_Foo>,
public IPlugin,
public IEventSubscriber
{
// ...
};
Necesito pasarlo a otro objeto, así:
pOther->MethodTakingIUnknown(this);
Cuando hago esto, aparece el siguiente mensaje de error:
error C2594: ''argument'' : ambiguous conversions from ''Foo *const'' to ''IUnknown *''
¿Qué estoy haciendo mal?
Tanto IPlugin
como IEventSubscriber
se derivan de IUnknown
y, por lo tanto, C ++ no puede decidir por sí mismo cuál de IUnknown
s debe convertir implícitamente. Necesitas decirle explícitamente a C ++ cuál quieres. Hay dos opciones: cualquiera llama a GetUnknown()
(está disponible en todas las clases que tienen un mapa COM declarado):
pOther->MethodTakingIUnknown(GetUnknown());
o explícitamente lanzar this
a una de las interfaces base:
pOther->MethodTakingIUnknown( static_cast<IPlugin*>( this ) );
En este caso, no importa a qué interfaz base hagas clic, solo envía a cualquiera. Solo importa cuando implemente IUnknown::QueryInterface()
para que se emita constantemente en la misma base cada vez.