Если вам нужно специализировать стандартный алгоритм, вы можете сделать это в пространстве имен std. Это единственное, что вам разрешено делать в этом пространстве имен в соответствии со стандартом.
[lib.reserved.names] / 1
Не определено для программы на C ++
добавить декларации или определения в
Пространство имен STD или пространства имен внутри
Пространство имен STD, если не указано иное
указано. Программа может добавить шаблон
специализации для любого стандарта
шаблон библиотеки в пространство имен std.
Такая специализация (полная или
частичное) стандартной библиотеки
шаблон приводит к неопределенному поведению
если декларация не зависит от
определяемое пользователем имя внешней связи
и если специализация не соответствует
стандартные требования библиотеки для
оригинальный шаблон
Теперь вопрос в том, действительно ли вы хотите специализироваться std::less
. Обратите внимание, что std::less
вызовет оператор сравнения, определенный для вашего типа, поэтому вы можете предоставить эту операцию вместо того, чтобы специализировать шаблон.
Проблема со специализацией std::less
для вашего конкретного типа заключается в том, что это приведет к путанице, если вы предоставите операцию, отличную от той, которую выполняет operator<
для вашего типа. Если они выполняют одну и ту же операцию, просто оставьте определение std::less
по умолчанию без специализации.
Если вы не хотите предоставлять оператор сравнения, но все же хотите использовать тип в ассоциативных контейнерах или с алгоритмами, для которых требуется компаратор, вы можете предоставить внешний функтор сравнения под другим именем, который не будет путать других читателей себя где-то в будущем).