为什么名称空间不能成为模板参数?

Ale*_*lex 27 c++ templates namespaces language-design

我知道名称空间不能是模板参数.请参阅问题"专用于命名空间的模板":

鉴于:

namespace A {
  class Foo;
  class Bar;
}

namespace B {
  class Foo;
  class Bar;
}
Run Code Online (Sandbox Code Playgroud)

我想在命名空间上模板化一个类,A或者B使以下工作:

template<name> class C {
  name::Foo* foo;
  name::Bar* bar;
};
Run Code Online (Sandbox Code Playgroud)

我想知道为什么会这样.我知道模板不是结构,但编译器的设计是否存在技术限制?或者是否有一些重要的权衡实现此功能?

Pet*_*ker 27

当Bjarne Stroustrup第一次开始讨论C++标准会议中的模板时,他提到了名称空间作为模板参数.反应是持怀疑态度的,部分原因是命名空间本身是如此新颖,我们害怕将两件我们不理解的事情结合起来.

  • @windfinder - 我是怀疑论者之一. (18认同)
  • 你不是一个次要来源,是吗?!;-) (4认同)
  • 这是有趣的。您在哪里阅读/听到过此信息? (2认同)
  • @Catskul-对不起,我真的帮不上忙。X3J16的第一次会议是在1990年,有关未来方向的讨论将在最初的几次会议中进行。 (2认同)

Mar*_*tos 16

这将是:

  1. (IMO)不恰当的:命名空间避免名称冲突.多态性超出了他们的章程.
  2. 不必要的:它将无法实现结构体无法完成的任何事情.
  3. 可能很困难:命名空间不是一个完整的,自包含的实体.命名空间的不同成员可以在不同的头部甚至不同的编译单元中声明.

  • 多态性在用户定义类型的章程之外,直到它被添加到它们中. (9认同)
  • 不过,我认为你用第3项获得了它.似乎单独就会使实现变得难以实现,而语义也是荒谬的. (4认同)