template operator<<



  • Hallo,

    habe folgende Klasse

    class Test
    {
    public:
        template<typename T>
        Test& operator<<(T& value) {ss << value; return *this;}
    private:
        std::stringstream ss;
    };
    

    warum reicht eine templatisierte Version vom operator<< nicht aus, wenn ich ein int oder double einfügen will

    int main()
    {
        Test t;
        t << 1;
        t << 1.2;
    }
    

    in VS 2003 muss ich noch eine spezialisierte form mit int (bzw. long) und double machen...



  • template operator schrieb:

    warum reicht eine templatisierte Version vom operator<< nicht aus, wenn ich ein int oder double einfügen will

    int main()
    {
        Test t;
        t << 1;
        t << 1.2;
    }
    

    in VS 2003 muss ich noch eine spezialisierte form mit int (bzw. long) und double machen...

    dafür müßtest du das right-hand-side argument value entweder als
    by-const-ref oder als by-val definieren, weil du den int bzw. double
    wert als temporary übergibst und deswegen ein by-ref nicht möglich ist.

    aber hier ein beispiel :

    Test t;
    int x = 1;
    t << 1;
    

    sollte gehen. da du aber eh den wert des arguments in left_shift_operator
    nicht veränderst kannst du das ganze als by-const-ref deklarieten, dann
    kannst du auch wieder temporaries verwenden.

    [cpp]
    struct Test{
    template <typename rhs_t>
    Test& operator<<(rhs_t const& rhs);
    };

    ingo.


  • Mod

    loehken schrieb:

    dafür müßtest du das right-hand-side argument value entweder als
    by-const-ref oder als by-val definieren, weil du den int bzw. double
    wert als temporary übergibst und deswegen ein by-ref nicht möglich ist.

    Im Prinzip richtig, die Wortwahl kann aber verbessert werden. Numerische Literale sind skalare Rvalues und als solche keine Objekte - erst recht keine temporären Objekte. Nur so ist die Argumentation auch sinnvoll - eine Übergabe per (non-const) Referenz ist an sich nicht möglich, weil von vorneherein kein Objekt existiert, an das die Referenz gebunden werden könnte und das Binden von Referenzen auf nicht-const (und auch ein deduziertes T& wird niemals Rvalues binden, selbst wenn T ein const U ist)niemals temporäre Objekte erzeugt.
    Temporäre Objekte sind immer Klassenobjekte und nicht in jedem Falle Rvalues (allerdings alle Klassen-Rvalues temporäre Objete) - sie haben hier also mit dem Problem hier nicht direkt zu tun.



  • Sagen wir einfach es geht nicht weil es sich nicht um eine lvalue handelt 🙂



  • Danke für die Erklärung, leuchtet ein!


Anmelden zum Antworten