<>
после имени функции (включая оператор, такой как operator<<
) в объявлении означает, что это специализация шаблона функции. Например, с обычным шаблоном функции:
template <typename T>
void f(T x) { }
template<>
void f<>(int x) { } // specialization for T = int
(обратите внимание, что в угловых скобках могут быть указаны аргументы шаблона в зависимости от специализации шаблона функции)
<>
также может использоваться после имени функции при вызове функции для явного вызова шаблона функции, когда есть функция без шаблона, которая обычно лучше соответствует разрешению перегрузки:
template <typename T>
void g(T x) { } // (1)
void g(int x) { } // (2)
g(42); // calls (2)
g<>(42); // calls (1)
Итак, operator<< <>
не является оператором.