Подтвердить что ты не робот

Почему пространства имен не являются параметрами шаблона?

Я понимаю, что пространства имен не могут быть параметрами шаблона. См. Вопрос, шаблон, специализированный для пространства имен:

Дано:

namespace A {
  class Foo;
  class Bar;
}

namespace B {
  class Foo;
  class Bar;
}

Я хочу создать шаблон в пространстве имен A или B, чтобы следующее:

template<name> class C {
  name::Foo* foo;
  name::Bar* bar;
};

Мне было интересно, почему это так. Я понимаю, что шаблоны не являются структурами, но есть ли технические ограничения для дизайна компилятора? Или существует какой-то значительный компромисс для реализации этой функциональности?

4b9b3361

Ответ 1

Это будет:

  • (IMO) Не подходит: Пространства имен избегают конфликтов имен. Полиморфизм выходит за рамки их устава.
  • Ненужное: он не достигнет ничего, что уже нельзя сделать с помощью структур.
  • Возможно, сложно: пространство имен не является полным, автономным объектом. Различные члены пространства имен могут быть объявлены в разных заголовках и даже разных единицах компиляции.

Ответ 2

Назад, когда Бьярне Страуструп сначала начал говорить о шаблонах на встречах стандартов С++, он упомянул пространства имен как параметры шаблона. Реакция была скептична, отчасти потому, что сами пространства имен были настолько новыми, и мы боялись сочетать две вещи, которые мы не понимали.