Почему пространства имен не являются параметрами шаблона?
Я понимаю, что пространства имен не могут быть параметрами шаблона. См. Вопрос, шаблон, специализированный для пространства имен:
Дано:
namespace A {
class Foo;
class Bar;
}
namespace B {
class Foo;
class Bar;
}
Я хочу создать шаблон в пространстве имен A
или B
, чтобы следующее:
template<name> class C {
name::Foo* foo;
name::Bar* bar;
};
Мне было интересно, почему это так. Я понимаю, что шаблоны не являются структурами, но есть ли технические ограничения для дизайна компилятора? Или существует какой-то значительный компромисс для реализации этой функциональности?
Ответы
Ответ 1
Это будет:
- (IMO) Не подходит: Пространства имен избегают конфликтов имен. Полиморфизм выходит за рамки их устава.
- Ненужное: он не достигнет ничего, что уже нельзя сделать с помощью структур.
- Возможно, сложно: пространство имен не является полным, автономным объектом. Различные члены пространства имен могут быть объявлены в разных заголовках и даже разных единицах компиляции.
Ответ 2
Назад, когда Бьярне Страуструп сначала начал говорить о шаблонах на встречах стандартов С++, он упомянул пространства имен как параметры шаблона. Реакция была скептична, отчасти потому, что сами пространства имен были настолько новыми, и мы боялись сочетать две вещи, которые мы не понимали.