trabajo situaciones optica imagenes ilusion ejemplos ambiguo ambiguedad ambiguas com atl

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.