There are three kinds of template arguments corresponding
to the three types of template parameters:
A template argument must match the type and form specified by
the corresponding parameter declared in the template.
When a parameter
declared in a template is a template parameter pack, it corresponds
to zero or more template arguments. For more information, see
Variadic templates (C++11)
To use the default value of a template parameter, you
omit the corresponding template argument. However, even if all template
parameters have defaults, you still must use the angle brackets
<>.
For example, the following will yield a syntax error:
template<class T = int> class X { };
X<> a;
X b;
The last declaration,
X b, will yield
an error.