typedef和具有相同名称的模板参数

use*_*538 11 c++ templates typedef ambiguous language-lawyer

为什么这种情况不正确(这是合乎逻辑的)

template <typename T>
struct Der: public Base
{
    typedef int T;
    T val;
};
Run Code Online (Sandbox Code Playgroud)

,但那个案子是对的吗?

struct Base
{
    typedef int T;
};

template <typename T>
struct Der: public Base
{
    T val;
};
Run Code Online (Sandbox Code Playgroud)

标准14.6.1/7说:

在类模板的定义中或在模板定义之外出现的这种模板的成员定义中,对于不依赖于模板参数的每个基类(14.6.2),如果名称是基类或基类成员的名称与template-parameter的名称相同,基类名称或成员名称隐藏模板参数名称(3.3.7).

为什么这里不含糊?

Col*_*mbo 15

根据[temp.local]/6,第一个示例不正确:

模板参数不得其范围(包括嵌套作用域)内重新声明.

但是,在

template <typename T>
struct Der: public Base
{
    T val;
};
Run Code Online (Sandbox Code Playgroud)

T被继承自的名称隐藏Base- 由您的报价指定.

[..] 如果基类或名称的基类的一个成员的名称是相同的一个的名称模板参数,基类名或成员名隐藏模板参数名称(3.3.7 ).

也就是说,该成员val属于类型int.演示.