Templates in general
Ignoring the details of std::vector
for the moment, it is possible to define a default type for a template parameter of a class template. For example:
template <class T = int>
class foo {
T *bar;
};
In such a case, you don't have to specify a type to instantiate that template. At the same time, you do have to include a template parameter list. The trick is that the list can be empty, so you could instantiate this template in any of the following ways:
foo<long> a; // instantiate over long. The `int` default is just ignored
foo<int> b; // instantiate over int. Still doesn't use default
foo<> c; // also instantiates over int
std::vector
specifically
std::vector
does use a default parameter for the type of the allocator, but does not provide a default for the type being stored, so the definition looks something like this:
template <class T, class allocator = std::allocator<T>>
class vector
// ...
So, if you don't specify otherwise, the allocator type for the vector will be an std::allocator
instantiated over the same type as you're storing--but you do always have to specify a type you're storing, because no default is provided for that type.
Summary
It is definitely possible to specify defaults for all the parameters to a template, in which case it's possible to instantiate the template without (explicitly) specifying the type at the instantiation--but std::vector
has one template parameter for which no default is provided, so to instantiate vector
, you must specify a type for that parameter.