auto_ptr Konstruktor in std::pair Verwirrung



  • Folgender Code lag zugrunde (compiliert fehlerfrei):

    std::vector < std::pair < double, TPoint* > > Factors;
    Factors.push_back(std::pair <double, TPoint* > (Calculated, new Point(LastFund,KlammerZu2)));
    

    Dann umgeformt zu:

    std::vector < std::pair < double, std::auto_ptr<TPoint> > > Factors;
    std::pair <double, std::auto_ptr <TPoint> > (Calculated, std::auto_ptr <TPoint>(new TPoint(LastFund,KlammerZu2)));
    

    Ich erhalte:

    [BCC32 Fehler] utility(36): E2285 Keine Übereinstimmung für 'auto_ptr<TPoint>::auto_ptr(const auto_ptr<TPoint>)' gefunden
    [BCC32 Fehler] vector(1179): E2285 Keine Übereinstimmung für 'pair<double,auto_ptr<TPoint> >::pair(const pair<double,auto_ptr<TPoint> >&)' gefunden
    [BCC32 Fehler] vector(1203): E2285 Keine Übereinstimmung für 'pair<double,auto_ptr<TPoint> >::pair(const pair<double,auto_ptr<TPoint> >&)' gefunden
    [BCC32 Fehler] xutility(1681): E2285 Keine Übereinstimmung für 'operator pair<double,auto_ptr<TPoint> >::=(const pair<double,auto_ptr<TPoint> >)' gefunden
    [BCC32 Fehler] xmemory(28): E2285 Keine Übereinstimmung für 'pair<double,auto_ptr<TPoint> >::pair(const pair<double,auto_ptr<TPoint> >)' gefunden

    Wo ist mein (Denk-) Fehler?

    Ach und zur ersten Fehlerzeile: Wo kommt das const den plötzlich her?

    EDIT: darf ich auto_ptr hier nicht verwenden? Ich meine mal gelesen zu haben, dass der =operator für auto_ptr nicht existiert oder sich anders verhält, als man erwartet.
    (ich weiß = taucht nicht auf, aber vielleicht ist es mit dem Kopierkonstrukor genauso?)



  • auto_ptr ist nicht kopierbar. Du willst einen unique_ptr.



  • Hallo

    Deine Vermutung ist richtig. Diese Verwendung dort erfordert die Kopierbarkeit von auto_ptr, was dieser aber nicht anbietet. Daran kannst du nichts ändern.

    Wenn du einen Smartpointer verwenden willst, dann schau im Netz nach dem Quellcode für eine Implementation mit Referenzzählung, diese bieten dann auch Kopierbarkeit.
    (Natürlich könnte deine Builder-Variante auch schon eine andere Art von Smartpointer besitzen)

    bis bald
    akari



  • kann ich mir tr1 nicht einfach herunterladen?



  • C++Builder 2009 und höher enthält TR1. Du mußt ggf. in den Include-Pfaden den Eintrag $(CG_BOOST_ROOT)\boost\tr1\tr1 über $(BDSINCLUDE)\dinkumware plazieren (ggf. hinzufügen, wenn nicht vorhanden).



  • Das ist ja schon fast versteckt 😃

    (boost_1_35\boost\tr1)


Anmelden zum Antworten