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

时间:2012-10-16 00:34:06

标签: c++ templates namespaces language-design

我知道名称空间不能是模板参数。请参阅问题"template specialized on a namespace"

  

假设:

namespace A {
  class Foo;
  class Bar;
}

namespace B {
  class Foo;
  class Bar;
}
     

我想在命名空间AB上模拟一个类,以便以下工作:

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

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

2 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:16)

这将是:

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