[英]Using and re-defining typedef from base class
在名称定义的一部分中引用基类成员和在另一部分中引用类成员是否合法? 此代码演示了它:
struct Base
{
typedef int T;
};
struct Derived : Base
{
T m1; //type int
typedef T *T;
T m2; //type int*
};
我无法在标准中找到对此的裁决。 代码合法吗?
幸运的是,在这种情况下,它是否合法并不重要(我相信它的结构良好,因为typedef被允许阴影),因为你可以做一个微小的重构改变,代码变得非常明显:
struct Derived : Base
{
typedef Base::T BaseT;
typedef BaseT* T;
BaseT m1; //type int
T m2; //type int*
};
我认为它是合法的( typedef
肯定是按照它们出现的顺序处理的),但对于任何试图在将来阅读代码的人来说,这将是可怕的混乱。
重命名次要类型会更有意义:
typedef T *Tptr;
Tptr m2;
是的,这是合法的。 我不会评论它是否可取。
首先,您需要能够在派生类中重新声明具有相同名称的不同实体; 这是允许的3.3.10 / 1(我的重点):
名称可以通过嵌套声明性区域或派生类中的相同名称的显式声明来隐藏。
然后你需要T
在Derived::T
的声明中引用Base::T
Derived::T
; 即Derived::T
必须不在此范围内。 范围由3.3.3 / 1定义:
它的潜在范围从其声明点开始,并在其块结束时结束。
声明点由3.3.2 / 1定义:
名称的声明点紧跟在其完整的声明者之后
意味着,在声明者之前和期间, Derived::T
不在范围内,因此T
指的是Base::T
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.