Почему пространства имен не могут быть параметрами шаблона?

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

Дано:

namespace A {
class Foo;
class Bar;
}

namespace B {
class Foo;
class Bar;
}

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

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

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

23

Решение

Это было бы:

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

Другие решения

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

25

По вопросам рекламы [email protected]