boost-Warnung in ptr_vector: unref. lok. Var. res?



  • Hi,

    ich nutze gerade den ptr-Container und erhalte eine merkwürdige Warnung:

    template< class T > // Code in der boost-lib, nicht von mir
        inline T* new_clone( const T& r )
        {
            //
            // @remark: if you get a compile-error here,
            //          it is most likely because you did not
            //          define new_clone( const T& ) in the namespace
            //          of T.
            //
            T* res = new T( r );
            BOOST_ASSERT( typeid(r) == typeid(*res) &&
                          "Default new_clone() sliced object!" );
            return res;
        }
    

    Und er sagt beim return, res sei eine undefinierte lokale Variable. Wie habe ich das denn zu verstehen? Sieht doch nicht wirklich undefiniert aus. Sollte mir das zu denken geben?


  • Mod

    Kannst du mal die exakte, unübersetzte Fehlermeldung angeben?



  • Es ist nur eine Warnung, aber natürlich gern:

    `

    1> Application.cpp

    1>d:\entwicklungsbibliotheken\boost_1_44_0\boost\ptr_container\clone_allocator.hpp(37): warning C4700: Die nicht initialisierte lokale Variable "res" wurde verwendet.`

    in der return-Zeile o.geposteten Codes.


  • Mod

    Ahh, uninitialisiert! Ich war schon sehr verwirrt durch das undefiniert.

    Allgemein haben Compiler natürlich Recht bei so etwas, aber ich sehe es gerade selber nicht. Kannst du ein kurzes Beispiel erstellen (von boost kannst du erwarten, dass wir das haben, aber die Version ist evtl. noch wichtig), welches die Warnung wirft. Und den Compiler, Compileroptionen und Compilerversion.



  • Ich habe mich damit nicht mit dem Klonen von ptr_containern auseinandergesetzt. Es sieht aber so aus, als ob dieses new_clone nur ein Fallback von Boost ist, welcher nur dann funktioniert, wenn keine Polymorphie im Spiel ist. Möchtest Du das Klonen polymorph haben, musst Du eine eigene new_clone-Funktion schreiben die dann per ADL aufgerufen werden soll. Beispiel:

    class abc { // abstrakte basis-klasse
    public:
      virtual ~abc() {}
      virtual abc* clone() const = 0;
    };
    
    inline abc* new_clone(abc const& x) {return x.clone();}
    

    So oder so ähnlich steht das bestimmt auch in der Doku.

    Edit:
    Ach! Und ich dachte, Dir fliegt die Assertion um die Ohren... Nächtes mal bitte gleich die entsprechende Meldung verraten. Danke.



  • Ja, sorry im Topic stand "unref." und "boost-Warnung", aber im OP war das verwirrend.

    Kriege ich diese Warnung weg oder kann ich sie getrost ignorieren bzw. weg-präprozessor-ieren?


Anmelden zum Antworten