2009-12-09 44 views
7

bende bir ATL sınıfı 'Foo * const' dan belirsiz dönüşümler:'argümanı': 'Iunknown *'

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

böyle, başka bir nesneye geçmek gerekir:

bunu yaparken
pOther->MethodTakingIUnknown(this); 

, aşağıdaki hata iletisini olsun: yanlış

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

yapıyorum?

cevap

9

Hem IPlugin ve IEventSubscriberIUnknown elde edilir ve böylece C++ IUnknown s biri örtülü olarak yayın yapmak için hangi kendi başına karar veremez. C++ 'ya istediğinizi açıkça söylemeniz gerekir. İki seçenek vardır konum: Bu çok içinde

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

:

pOther->MethodTakingIUnknown(GetUnknown()); 

veya açıkça baz arayüzleri birine this dökme: ya GetUnknown() çağrı (ilan eden bir COM haritası olan her sınıfta mevcut) durumda, hangi temel arayüzü kullanacağınız önemli değil - sadece herhangi birine dökün. Her seferinde aynı tabana sürekli olarak dökülmek için sadece IUnknown::QueryInterface() uygulandığında önemlidir.

+0

+1: Benimkilerden daha iyi bir yanıt, çünkü ATL dışı davasını da kapsamaktadır. –

+0

Net olmak gerekirse, 'GetUnknown()' bir ATL olayıdır. – zneak