ISO草案n3290第3.3.9节第4段:
模板参数名称的声明性区域嵌套在 立即封闭声明 区域。[注:结果,a template-parameter隐藏任何实体 在封闭中使用相同的名称 范围(3.3.10)。
Example:
typedef int N;
template<N X, typename N, template<N Y> class T> struct A;
任何人都可以......告诉除此之外的其他一些例子..其中&amp;这种情况发生的地方
草稿链接n3290:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf
答案 0 :(得分:3)
我认为很明显:只要模板声明范围内的实体与其中一个模板参数同名,名称就会隐藏在模板中。如果您在提出示例时遇到问题,则可能是因为您不理解引用的含义。你理解的是什么?什么是你有理解的麻烦?
对于那些不想进入标准的人,重要的是要完成原始报价:
typedef int N;
template<N X, typename N, template<N Y> class T> struct A;
这里,X是int类型的非类型模板参数,Y是与A的第二个模板参数相同类型的非类型模板参数。 - 结束示例] - 结束注释]
这有助于理解这个例子。请注意引用的含义:第一个N
引用命名空间范围内的typedef
,然后引入模板参数N
。从那时起,模板参数隐藏外部N
,N
的下一次出现是指模板参数,而不是外部N
(仅在模板的声明范围内)
答案 1 :(得分:3)
不确定
int n = 0;
void f() {
int n = 42;
}
函数中的n隐藏了在全局范围内声明的那个。