Strictly speaking, you could not refer to the specialization of a function template by simply specifying a list of template arguments. You should always have the type of target (for example, the type of the parameter of the function you are going to, or the type of the throw you are pointing to, or the type of the variable you are assigning).
This was true even if the target type is completely free of template parameters, for example
template<typename T> void f() { } template<typename T> void g(T) { } int main() { g(f<int>);
The committee added the rules that were adopted in C ++ 0x and by popular compilers in their C ++ 03 mode, which made it possible to omit the target type if you provide a complete list of template arguments, providing types for all template parameters, along with all template arguments default.
source share