unique_ptr cannot acces private member



  • Hallo,
    immer wenn ich sowas mache,

    std::unique_ptr<SceneNode> child(new SceneNode());
    mSceneGraph.attachChild(child);
    

    bekomme ich diese Fehler Meldung:

    error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

    Die Funktion ist so deklariert:

    void attachChild(std::unique_ptr<SceneNode> child);
    

    Und auch wenn ich nichts in der Funktion mache, bekomme ich diese Fehlermeldung.
    Ich kann meinen Logik Fehler nicht entdecken. 😕



  • unique_ptr ist nur moveable, also std::move bei Parameteruebergabe. Wurde aber hier schon gesagt: http://www.c-plusplus.net/forum/320317 .



  • std::unique_ptr ist nicht kopierbar, nur verschiebbar:

    mSceneGraph.attachChild(std::move(child));
    


  • Du kannst unique_ptr nicht kopieren. Das ist doch gerade das wichtige daran. Es ist unique ownership, es besitzt nur immer einer die Ressource. Wenn du es kopieren könntest, würden plötzlich zwei unique_ptr s eine Ressource besitzen. (wenn die Ressource auch kopiert wird, dann nicht - aber deep copy ist nicht standardmäßig implementiert)

    Für so etwas (shared ownership) gibt es shared_ptr - was du aber höchstwahrscheinlich gar nicht willst:
    unique_ptr musst du moven.

    std::unique_ptr<SceneNode> child(new SceneNode());
    mSceneGraph.attachChild( std::move(child) );
    

    Edit: Ack! Viel zu spät!



  • unique_ptr hat keinen Kopierkonstruktor.
    Musst wegen LValue explicit sagen, dass du moven willst (std::move), danach ist der Ursprungspointer aber null!

    Edit: Was? Drei Minuten zu spät? oO



  • @Sone: Koenntest du bitte aufhoeren zu schreien!
    @Nathan: Das ist kein Wettrennen. Wenn er es 3 Mal liesst, dann bleibt es hoffentlich einmal haengen.



  • knivil schrieb:

    @Sone: Koenntest du bitte aufhoeren zu schreien!

    Ich hab es schon editiert. 🙂 👍

    Was? Drei Minuten zu spät? oO

    Ja, ich sah "[Antworten:] 0" und dachte mir, hihi, noch alle verpennt....

    Wenn er es 3 Mal liesst, dann bleibt es hoffentlich einmal haengen.

    *4



  • knivil schrieb:

    @Nathan: Das ist kein Wettrennen. Wenn er es 3 Mal liesst, dann bleibt es hoffentlich einmal haengen.

    Ich hatte mich nur gewundert, wieso in der kurzen Zeit drei Minuten vergangen sind, mein Browser hatte wohl nicht richtig die Seite aktualisiert o.ä.



  • Oh na kla, bin noch zimlich neu was smart pointer angeht danke!


Anmelden zum Antworten