Dieses Snippet stammt aus dem C++ Primer-Buch. Obwohl ich sicher bin, dass dies falsch ist.
Jedem Typparameter muss das Schlüsselwort class oder typename vorangestellt werden:
// error: must precede U with either typename or class
template <typename T, U> T calc(const T&, const U&);
Diese Schlüsselwörter haben die gleiche Bedeutung und können innerhalb einer Vorlagenparameterliste austauschbar verwendet werden. In einer Template-Parameterliste können beide Schlüsselwörter verwendet werden:
// ok: no distinction between typename and class in a template parameter list
template <typename T, class U> calc (const T&, const U&);
Es mag intuitiver erscheinen, das Schlüsselwort typename anstelle von class zu verwenden, um einen Schablonentyp-Parameter zu bezeichnen. Schließlich können wir auch eingebaute (klassenfremde) Typen als Argument für einen Vorlagentyp verwenden. Außerdem zeigt typename deutlicher an, dass der nachfolgende Name ein Typname ist. Allerdings wurde typename zu C++ hinzugefügt, nachdem Vorlagen bereits weit verbreitet waren; einige Programmierer verwenden weiterhin ausschließlich class