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.
-
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!