【问题标题】:template parameter hiding模板参数隐藏
【发布时间】:2011-08-24 17:19:35
【问题描述】:

ISO 草案 n3290 第 3.3.9 节第 4 段中的一点:

模板参数名称的声明区域嵌套在 立即封闭的声明 地区。[注:因此,一个 模板参数隐藏任何实体 在一个封闭的同名 范围 (3.3.10)。

Example:
typedef int N;
template<N X, typename N, template<N Y> class T> struct A;

任何人都可以......请告诉其他一些例子,除了这个......这种情况发生在哪里和哪里

草稿链接 n3290:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf

【问题讨论】:

  • 只是想知道,模板声明中, typename N, 的目的是什么?
  • @iammilind:您可能应该阅读一些有关模板的基本教程。在这种情况下,typenameclass 是等效的,如果这回答了您的问题。如果没有,则它声明一个名为N 的类型模板参数,这反过来在模板范围内创建一个本地类型别名N,该类型在实例化期间用作模板的第二个参数。在该特定示例中,目的是因为 N 也是命名空间级别的类型,因此此参数隐藏命名空间范围内的 typedef。

标签: c++ templates c++11


【解决方案1】:

我认为这很明显:任何时候模板声明范围内的实体与模板参数之一具有相同的名称,该名称将隐藏在模板中。如果您在提出示例时遇到问题,则可能是您不理解引用的含义。你明白了什么?你有什么难以理解的地方?

对于那些不想进入标准的人来说,完成原始报价很重要:

   typedef int N;
   template<N X, typename N, template<N Y> class T> struct A;

这里,X是int类型的非类型模板参数,Y是与A的第二个模板参数相同类型的非类型模板参数。 --结束示例] --结束说明]

这有助于理解示例。注意引号的含义:第一个N 指的是命名空间范围内的typedef,然后引入了模板参数N。从那里开始,模板参数隐藏外部NN 的下一个出现指的是模板参数而不是外部N(仅在声明范围内模板)

【讨论】:

  • 感谢您的解释...但是您能说一些其他的例子吗..正好适合这种情况。(以上点)
  • @user751747:同样,如果你不能想出一百个其他例子(创建不同的类型,定义隐藏它们的模板参数,验证它们是否隐藏),这意味着你有不太明白这句话。
【解决方案2】:

当然:

int n = 0;

void f() {
   int n = 42;
}

函数中的 n 隐藏了在全局范围内声明的那个。

【讨论】:

  • 我不知道。我们似乎也在讨论隐藏。
猜你喜欢
  • 2016-10-26
  • 2017-05-09
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多