Почему?
Ответ находится в теле вопроса. Это работает для классов и функций, потому что в C есть отдельное пространство имен для тегов структуры и идентификаторов функций. Если C ++ нацелен на взаимодействие с кодом C, он должен сохранить это поведение. Достаточно взглянуть на такой API, как функция stat
, принимающая аргумент struct stat
, чтобы понять, почему C ++ сохранил достоверность такого кода. Эта работа с пространствами имен просто встроена в код C, находящийся в глобальном пространстве имен (поэтому ::stat
и struct ::stat
должны продолжать работать при необходимости).
Однако в C ++ идентификаторы тегов классов разделяют «пространство имен» с обычными идентификаторами. Таким образом, валидность этого «взлома» достигается с помощью специального случая в спецификации C ++, который просто скрывает классы, когда они конфликтуют.
[basi c .scope.hiding]
2 Имя класса или имя перечисления может быть скрыто именем переменной, члена данных, функции или перечислителя, объявленных в той же области. Если имя класса или перечисления и переменная, член данных, функция или перечислитель объявлены в одной и той же области (в любом порядке) с одним и тем же именем, имя класса или перечисления скрыто везде, где переменная, член данных, функция или Имя перечислителя видно.
Неважно, думали ли разработчики C ++ это хорошая или плохая идея. Существует устаревший код, который компиляторы C ++ должны по-прежнему принимать как действительный для облегчения взаимодействия с определенными системами.
Но нет устаревшего кода, работающего с шаблонами, который требует такого же поведения. Шаблоны - это полностью конструкция C ++ (не имеющая отношения к C). Таким образом, дизайн языка не имеет внешних ограничений, позволяющих добавить больше особых случаев для имен шаблонов. И это не так.
Предположим, для меня важно иметь такое же имя. Могу ли я как-нибудь заставить это работать?
На ум не приходит способ заставить это работать.