2009-12-09 3 views
7

У меня есть класс АТЛ «IUnknown *»:«аргумент»: неоднозначные преобразования из «Foo * сопзЬ» до

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

мне нужно передать его на другой объект, например:

pOther->MethodTakingIUnknown(this); 

Когда я делаю это, я получаю следующее сообщение об ошибке:

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

Что я делаю неправильно?

ответ

9

Оба IPlugin и IEventSubscriber получены из IUnknown и поэтому C++ не может решить сам по себе, который один из IUnknown с приведением к неявной. Вам нужно явно указать C++, который вы хотите. Там вы два варианта: либо вызвать GetUnknown() (имеется в каждом классе, имеющем COM карту объявившего):

pOther->MethodTakingIUnknown(GetUnknown()); 

или явно бросить this одному из базовых интерфейсов:

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

В этом очень Случай не имеет значения, к какому базовому интерфейсу вы прикасаетесь - просто бросаете на любой. Это имеет значение только тогда, когда вы реализуете IUnknown::QueryInterface(), чтобы последовательно приводить к той же базе каждый раз.

+0

+1: лучше ответьте, чем у меня, потому что он также охватывает случай, не относящийся к ATL. –

+0

Чтобы быть понятным, 'GetUnknown()' - вещь ATL. – zneak

Смежные вопросы