K
vario-500 schrieb:
ja spar sie dir, wenn du es eh besser weißt, warum ein template stack oder ähnliches http://ideone.com/QTH9mG ausekräftiger, besonders für einen anfänger besser zu verstehen, sein soll, als die fehlermerldung beim enable_if, würde ich dann schon gerne wissen. wenn du hierfür ein gutes und überzeugendes argument liefern kannst, würde mich das schon freuen, zumindest mehr als deine unkonstruktiven beleidigungen.
Natuerlich ist das aussagekraeftiger, mach die Augen auf.
prog.cpp: In function 'void foo(T, T) [with T = std::vector<int>]':
prog.cpp:9:71: instantiated from here
prog.cpp:5:4: error: no match for 'operator+' in 't1 + t2'
Hier steht /ganz genau/, was das Problem ist, naemlich, dass es keinen operator+ gibt.
Sone schrieb:
Wenn jemand eine Zeile Code schreibt, erwarte ich von diesem jemand ein gewisses Verständnis für diese Zeile.
Wenn jemand ein Funktionstemplate instantiieren lässt, dann müssen ihm die Bedingungen und die Verwendungsweise völlig klar sein. Sprich: Es geht hier nicht darum, ein Funktionstemplate zu schreiben das beim ausprobieren eine tolle Fehlermeldung wirft. Sondern eines, dass einfach nur mit einem bestimmten Typ instantiiert werden darf. Dafür ist enable_if da.
Braucht man eine ordentliche Fehlermeldung, nimmt man static_assert / BOOST_STATIC_ASSERT .
Erstens spricht nichts dagegen, das Template mit meiner Bigint Klasse zu instanzieren, ausser dass /du/ mich mit deinem enable_if Schrott daran hinderst. (Mit einem Concept waere das absolut legitim)
Und zweitens habt ihr alle beide den Zweck von enable_if nicht verstanden. enable_if ist in erster Linie /nicht/ dazu da, Instanzierung eines Templates zu verhindern, und einen Fehler zu erzeugen. enable_if ist dazu da, bei mehreren Overloads /gezielt/ bestimmte Overloads aus dem Overload-Set zu schmeissen, weil sie etwas falsches tun wuerden, bei Overload Resolution beforzugt wuerden, aber einen Fehler erzeugen wuerden, etc.
Fuer deinen Fall ist, wie du bereits richtig erkannt hast, static_assert zu verwenden. Aber dann mach auch bitte einen ordentlichen Check, ob T einen passenden operator + hat.