2009-12-09 13 views
7

Ho una classe ATL:'argomento': conversioni ambigue da 'Foo * const' a 'IUnknown *'

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

ho bisogno di passare ad un altro oggetto, in questo modo:

pOther->MethodTakingIUnknown(this); 

Quando faccio questo, ottengo il seguente messaggio di errore:

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

che cosa sto facendo di sbagliato?

risposta

9

Sia IPlugin e IEventSubscriber sono derivati ​​da IUnknown e quindi C++ non può decidere da sola che uno dei IUnknown s per lanciare in modo implicito. Devi dire esplicitamente a C++ quale vuoi. Ci sono due opzioni: o chiamare GetUnknown() (è disponibile in ogni classe avere una mappa COM dichiarato):

pOther->MethodTakingIUnknown(GetUnknown()); 

o esplicitamente gettato this ad una delle interfacce di base:

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

In questo caso non importa quale interfaccia di base hai lanciato per lanciarti su cast. Importa solo quando si implementa IUnknown::QueryInterface() in modo coerente nella stessa base ogni volta.

+0

+1: risposta migliore della mia, perché copre anche il caso non ATL. –

+0

Per essere chiari, 'GetUnknown()' è una cosa ATL. – zneak

Problemi correlati