Variablenkonvertierung - Problem mit Beispielcode aus älterem Buch
-
Der folgende Code ist aus einem Microsoft Buch von 2003, das allerdings nicht mehr gedruckt wird.
Die Zeilelist.push_back(pPin)führt zur Fehlermeldung
error C2664: 'std::allocator<_Ty>::construct': Konvertierung des Parameters 1 von 'IPin **' in 'ATL::CComPtr<T> *' nicht möglich with [ _Ty=PinPtr ] and [ T=IPin ] Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat. c:\programme\microsoft visual studio 8\vc\include\list(1154): Bei der Kompilierung der Klassen-template der std::_List_nod<_Ty,_Alloc>::_Node *std::list<_Ty>::_Buynode(std::_List_nod<_Ty,_Alloc>::_Node *,std::_List_nod<_Ty,_Alloc>::_Node *,const _Ty &)-Memberfunktion with [ _Ty=PinPtr, _Alloc=std::allocator<PinPtr> ] c:\dokumente und einstellungen\dc\eigene dateien\visual studio 2005\projects\directxtest029\directxtest029\main.cpp(23): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "std::list<_Ty>". with [ _Ty=PinPtr ]. Es gibt auch eine Hilfeseite dazu, die u.a. besagt, dass so etwas in früheren VC++-Versionen evtl. kein Problem war. Den Rest verstehe ich aber leider nicht, vor allem nicht, was man dagegen tun kann.
Zu allem Übel tritt dieser Fehler bei allen Demo-Programmen auf der CD zum Buch auf, sodass ich nicht wirklich weiterkomme...
Wenn ich es richtig verstehe, muss man "nur" eine Variable (pPin) konvertieren - wahrscheinlich, bevor sie der Liste hinzugefügt wird. Aber wie und in was?
Danke euch!
typedef CComPtr<IPin> PinPtr; typedef std::list<PinPtr> PinList; typedef PinList::iterator PinIterator; HRESULT GetPinList( IBaseFilter *pFilter, PIN_DIRECTION Direction, PinList& list) { if (!pFilter) { return E_POINTER; } CComPtr<IEnumPins> pEnum; HRESULT hr = pFilter->EnumPins(&pEnum); if (FAILED(hr)) { return hr; } CComPtr<IPin> pPin; while (S_OK == pEnum->Next(1, &pPin, NULL)) { PIN_DIRECTION ThisDirection; hr = pPin->QueryDirection(&ThisDirection); if (ThisDirection == Direction) { list.push_back(pPin); } pPin.Release(); } return S_OK; }
-
das gehört nicht in dieses forum. das problem ist hier, das CComPtr (wie auch all die anderen "smart pointer" der ATL) sinnloserweise den operator& überladen - und zwar auf eine weise, die sich nicht mit den containervoraussetzungen der standardbibliothek verträgt. folglich ist es schlicht illegal, eine std:list mit dem elementtyp CComPtr<T> zu benutzen. aus diesem grunde gibt es das CAdapt template. allerdings ist das resultat eine krücke, die ich keinem empfehle zu benutzen. vergiss lieber gleich CComPtr und bau dir einen eigenen smartpointer dafür (boost::intrusive_pointer bietet sich als basis geradezu an).
-
das gehört nicht in dieses forum.
Entschuldigt bitte, das hatte ich erst jetzt gesehen. Vielleicht kann mich ja ein Moderator in die richtige Richtung verschieben...
Nachdem ich jetzt (endlich) boost installiert habe und es auch nutzen könnte, wenn ich denn könnte, ein paar Artikel über Smartpointer angesehen habe (z.B. http://www.c-plusplus.net/forum/viewtopic-var-t-is-134971.html), scheitere ich wie immer kläglich an der Umsetzung. SmartPointer sind eben wohl doch schon eine sehr fortgeschrittene Technik...
Gibt es nicht eine einfache Variante? Das Beispiel ist aus einem knapp 3 Jahre alten Buch, - da muss doch irgend etwas mit drei Zeilen Code zu machen sein?! - Ihr könnt da natürlich nichts zu, aber wen soll ich bei Microsoft (Verlag des Buches) denn fragen? Wie schon gesagt: Der Fehler tritt bei jedem Beispiel auf.