type parameter in C++

The primary restriction when using templates is that a type argument must support any operations that are applied to the type parameters. 
* There is no inherent requirement that the type arguments for any particular template all belong to the same object hierarchy, although you can define a template that enforces such a restriction.
* There is no practical limit to the number of type parameters; 
    * You can use the ellipsis operator (...) to define a template that takes an arbitrary number of zero or more type parameters.
    * Separate multiple parameters by commas.
* The keyword class is equivalent to typename in this context. 
* Any built-in or user-defined type can be used as a type argument.
* Class and function templates can have default arguments. 
    * For multiple template arguments, all arguments after the first default argument must have default arguments.
    * When using a template whose parameters are all defaulted, use empty angle brackets.