Template: Wieso werden nicht float und int akzeptiert?
-
Hallo, folgender Code
#include <iostream> using namespace std; template<typename typ> void dividiere (typ wert1, typ wert2) { typ ergebnis = wert1/wert2; cout<<"Ergebnis ist : "<<ergebnis<<endl; } int main() { dividiere(34.657, 7.34); return(0); }
Je nachdem wie ich dividiere aufrufe erkennt das Template ja den Typen der Variablen, sprich float, int ... und rechnet damit weiter.
Aber wieso kann ich nicht z.b.dividiere(7, 3.34)
machen?
-
du musst den Typnamen in spitzen klammern angeben.
-
Weil die Typen gleich sein müssen.
-
Wo muss ich den Typnamen in spitzen Klammer angeben
?
@Bashar das ist mir schon klar
ist es denn so das in Templates Typenumwandlungen ( casting ) nicht möglich ist?
-
Stimmt ich dachte, dass man nach dem fkt's namen noch den Typ in spitzen klammern schreiben muss.
divide<double>(12.09, 4.87);
Hatte aber unrecht. Es geht auch ohne.
-
Wenn der Compiler die Templateargumente nicht automatisch herleiten kann, musst du sie explizit angeben:
dividiere<int>(42, 7.0); // oder dividiere<float>(42, 7.0);
was auch immer du als Templateargument angeben willst.
-
Schablone schrieb:
@Bashar das ist mir schon klar
ist es denn so das in Templates Typenumwandlungen ( casting ) nicht möglich ist?
Probier mal diesen Aufruf.
divide<double>(4, 3.565);
Bei mir gehts.
-
besten dank an euch
-
Vielleicht hat der ein Problem weil das erste ein Intergerliteral ist. Probier auch mal dividiere(7., 3.34) aus.
-
Hum, aber wenn die beiden Typen wirklich unterschiedlich sein können, deklariert man dann nicht zwei template-Namen?
-
Mis2com schrieb:
Hum, aber wenn die beiden Typen wirklich unterschiedlich sein können, deklariert man dann nicht zwei template-Namen?
dafür sind doch templates da....
-
Er meint zwei Template-Argumente.
-
Wieso nicht einfach:
template<typename T1,typename T2> inline void dividiere (const T1&wert1,const T2&wert2) { cout<<"Ergebnis ist : "<<wert1/wert2<<endl; }
Klappt selbst wenn T1 und/oder T2 nur Klassen sind die den / operator überladen haben, und zwar ohne Copy Constructor. Im Falle von build-in types ist es wahrscheinlich, dass der Kompiler die Referenze wegoptimiren wird, und da er ja wegen des inline keine Funktion nicht anlegen muss kann er von Fall zu Fall optimiren.
-
@Bashar:
Richtig, mir war der Begriff entfallen...