Wir sehen uns jetzt ein einfaches Funktionstemplate an, das zwei Argumente eines Typs hat.
template <class T> inline T max(T a, T b) { return a > b ? a : b; }void main() { int x, y = 3, z = 4; double a, b = 1.4, c = 7.3; short m, n = 6, o = 9;
x = max(y, z); // max(int, int) a = max(b, c); // max(double, double) m = max(n, o); // max(short, short)
x = max(y, o); // max(int, short) ???? Fehler: Kann nicht generiert werden. }
Hier sehen wir jetzt auch, daß die Erzeugung von Funktionen mit Templates
nicht mit dem Schreiben der entsprechenden Funktionen äquivalent ist.
Hätten wir nämlich
statt des Templates zwei Maximums-Funktionen definiert, eine des Tys
int
und eine vom Type double
wären alle short
-Parameter
implizit in einen int umgewandelt worden. Für Template-Funktionen gibt es
aber gesonderte Ersetzungsstrategien, die zwar sehr viel stringenter sind,
aber eine sichere Programmierung zulassen.