<>
after a function name (including an operator, like operator<<
) in a declaration indicates that it is a function template specialization. For example, with an ordinary function template:
template <typename T>
void f(T x) { }
template<>
void f<>(int x) { } // specialization for T = int
(note that the angle brackets might have template arguments listed in them, depending on how the function template is specialized)
<>
can also be used after a function name when calling a function to explicitly call a function template when there is a non-template function that would ordinarily be a better match in overload resolution:
template <typename T>
void g(T x) { } // (1)
void g(int x) { } // (2)
g(42); // calls (2)
g<>(42); // calls (1)
So, operator<< <>
isn't an operator.