Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么可以';名称空间不是模板参数吗?_C++_Templates_Namespaces_Language Design - Fatal编程技术网

C++ 为什么可以';名称空间不是模板参数吗?

C++ 为什么可以';名称空间不是模板参数吗?,c++,templates,namespaces,language-design,C++,Templates,Namespaces,Language Design,我知道名称空间不能是模板参数。看到问题了吗 鉴于: namespace A { class Foo; class Bar; } namespace B { class Foo; class Bar; } 我想在命名空间a或B上模板化一个类,以使以下各项起作用: template<name> class C { name::Foo* foo; name::Bar* bar; }; 模板类C{ 名称::Foo*Foo; 名称::Bar*Bar; }; 我想

我知道名称空间不能是模板参数。看到问题了吗

鉴于:

namespace A {
  class Foo;
  class Bar;
}

namespace B {
  class Foo;
  class Bar;
}
我想在命名空间
a
B
上模板化一个类,以使以下各项起作用:

template<name> class C {
  name::Foo* foo;
  name::Bar* bar;
};
模板类C{
名称::Foo*Foo;
名称::Bar*Bar;
};
我想知道为什么会这样。我知道模板不是结构,但是编译器的设计有技术限制吗?或者在实现此功能时是否有一些重大的权衡?

这将是:

  • (IMO)不合适:名称空间避免名称冲突。多态性超出了他们的章程
  • 不必要的:它将无法实现结构无法实现的功能
  • 可能很难:名称空间不是一个完整的、自包含的实体。命名空间的不同成员可以在不同的头甚至不同的编译单元中声明

  • 当Bjarne Stroustrup在C++标准会议中首次谈到模板时,他把命名空间作为模板参数。人们的反应是怀疑的,部分原因是名称空间本身太新了,我们害怕把两件我们不了解的事情结合起来。

    有趣。我从来都不需要这个,但我想我可以理解你为什么想要它。。。大概有时。。。。。。。。。另一方面,这真的是我们使用名称空间的方式吗?这就是它们的设计目的吗?不,我认为不是。这只是属于“不是因为它不是”的范畴。可能会为C++1x提出一个很好的建议。您的
    C
    模板中缺少了几个
    typename
    关键字。有人试图为它提出一个标准建议吗?多态性在添加到用户定义的类型之前是超出了用户定义类型的范围的。不过,我认为您已经用第3项解决了这个问题。似乎仅此一项就将使实现变得难以处理,语义变得毫无意义。添加到不必要的:您可以始终执行
    命名空间A{struct types{typedef Foo Foo;typedef Bar;};}
    ,然后使用
    A::types
    作为模板参数。但是我觉得我很累。是最重要的原因(它从未设计用于此用途)。虽然2。确定将其作为语言的一项新功能没有什么价值。@LightnessRacesinOrbit:我同意第1项本身不是一个有力的论据,但当你将第2项考虑在内时,它会增加相当大的分量。我可以理解第1项和第2项的论据,但我一直认为,如果某件事情有意义,它应该被允许(允许戒律的限制),所以我觉得2很弱。3是真正有趣的问题。我觉得这在编译时很容易实现,但在链接时可能无法实现?@windfinder-我是怀疑论者之一。你不完全是第二来源,是吗?!;-)@彼得·贝克尔你还记得那次会议是什么时候吗,或者更好的是,有没有一个链接可以链接到一些关于它的在线对话?我正在进行讨论,如果可能的话,我想链接到原始资料。@Catskul--对不起,我帮不上忙。X3J16的第一次会议是在1990年,关于未来方向的讨论将在最初几次会议上进行。