为什么这种情况不正确(这是合乎逻辑的)
template <typename T>
struct Der: public Base
{
typedef int T;
T val;
};
,但这种情况是正确的吗?
struct Base
{
typedef int T;
};
template <typename T>
struct Der: public Base
{
T val;
};
标准 14.6.1/7 规定:
在类模板的定义中或在出现在模板定义之外的此类模板的成员的定义中,对于每个不依赖于模板参数的基类(14.6.2),如果基类或基类成员的名称与模板参数的名称相同,基类名称或成员名称隐藏模板参数名称(3.3.7)。
为什么这里没有歧义呢?
根据 [temp.local]/6,第一个示例是不正确的:
A 模板参数不得在其范围内(包括嵌套范围)重新声明。
然而,在
template <typename T>
struct Der: public Base
{
T val;
};
T
被继承自的名称隐藏Base
- 作为指定按你的报价.
[..] if基类的名称或成员的姓名
基类与 a 的名称相同模板参数, 这
基类名称或成员名称隐藏模板参数姓名
(3.3.7).
也就是说,会员val
属于类型int
. Demo http://coliru.stacked-crooked.com/a/c5c6ab317d38065c.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)