template keyword | Declares a template, specialization, or instantiation |
declaration := template-decl explicit-instantiation explicit-specialization template-decl ::= [export] template < template-parm-list > declaration template-parm-list ::= template-parm template-parm-list , template-parm template-parm ::= type-parm parm-decl type-parm ::= class [ identifier ] [= type-id ] typename [ identifier ] [= type-id ] template < template-parm-list > class [ identifier ] [= id-expr ] template-id ::= template-name < [ template-arg-list ] > typename-name ::= identifier template-arg-list ::= template-arg template-arg-list , template-arg template-arg ::= assignment-expr type-id id-expr explicit-instantiation ::= template declaration explicit-specialization ::= template < > declaration elaborated-type-specifier := class-key [::] [ nested-name ::] [template] template-id typename [::] nested-name :: [template] template-id simple-type-specifier := [::] nested-name :: template template-id postfix-expr := postfix-expr . [template] id-expr postfix-expr -> [template] id-expr pseudo-dtor-name := [::] nested-name :: template template-id :: ~ class-name nested-name := nested-name [:: template class-name ] qualified-id := [::] nested-name :: [template] unqualified-id |
The template keyword declares a template, a specialization of a template, or an instance of a template. The declaration can be a function declaration, function definition, class declaration, or class definition.
A template instance provides arguments for the template parameters, enclosing the arguments in angle brackets ( <> ). If the template is a member of a class, and the . or -> operator is used to access the member template, you must use the template keyword to tell the compiler to interpret the < symbol as the start of the template arguments. Similarly, use the template keyword in a qualified name when the name is used to instantiate the template in a context in which the compiler would interpret the < symbol as the less-than operator.
template <typename T> T min(const T& a, const T& b) { return a < b ? a : b; } typedef complex<float> cfloat; template <> min<cfloat>(const cfloat& a, const cfloat& b) { return cfloat(min(a.real(), b.real( )), min(a.imag(), b.imag( ))); } template int min<int>(const int&, const int&);
class , expression , identifier , type , Chapter 7