ISO草案n3290第3.3.9节第5段中的一点:
因为模板参数的名称无法在其潜在范围内重新声明 范围(14.6.1),模板参数的范围通常是其潜在的范围。然而, 仍然可以隐藏模板参数名称;
在这种情况下,“潜在范围”意味着什么?任何人都可以提供这样的例子吗?
草稿链接n3290:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3290.pdf
答案 0 :(得分:2)
来自同一部分的第3段:
模板的潜在范围 参数名称从它的位置开始 声明(3.3.2)并以此结束 声明区域结束。 [ 注意:这意味着 template-parameter 可用于后续声明 template-parameters 及其默认参数但不能使用 在前面的模板参数或 他们的默认参数。例如,
template<class T, T* p, class U = T> class X { /* ... */ }; template<class T> void f(T* p = new T);
这也意味着a template-parameter 可用于基类的规范。对于 例如,
template<class T> class X : public Array<T> { /* ... */ }; template<class T> class Y : public T { /* ... */ };
使用模板参数作为 基类意味着使用了一个类 必须定义模板参数 并且不仅仅是在课堂上宣布 模板被实例化。 - 结束记录 ]
答案 1 :(得分:2)
3.3.1:声明的范围是 与其潜在范围相同,除非 潜在范围包含另一个 声明同名。在那里面 案例,潜在范围 内部的声明(包含) 声明性区域被排除在外 中的声明的范围 外(含)声明区域。
通常情况下,这是指这样的情况:
void Foo(int i) {
{
int i = 5;
std::cout << i;
}
std::cout << i;
};
第二个i
的潜在范围被排除在第一个i
的范围之外。换句话说,这准确地描述了名称隐藏适用的位置。您引用的位表示模板名称也可以隐藏。