Проблема в том, что уже есть
template<class charT, class traits>
std::basic_ostream<charT,traits>&
operator<<(std::basic_ostream<charT,traits>&, charT);
в namespace std
. Поскольку basic_ostream<>
также находится в этом пространстве имен, ADL подхватывает его, когда вы выводите unsigned char
. Добавление собственной перегрузки может сделать вызов оператора неоднозначным, иначе ваша перегрузка будет игнорироваться.
Но даже если бы это работало, это было бы хрупко, потому что если забыть одно включение, это может слегка изменить смысл кода без какой-либо диагностики от компилятора.
И еще: каждый программист, который рассматривает такой код, будет считать, что вызывается стандартный оператор (и никогда не думает о добавлении включения, когда он добавляет еще один оператор вывода в код).
Короче говоря, может быть лучше добавить функцию , делающую то, что вы хотите.
Разумной семантической альтернативой может быть добавление потокового манипулятора, который вызывает желаемый выходной формат. Хотя я не уверен, что это технически возможно.