一个名称在类定义的一个部分中引用基类成员,在另一部分中引用派生类成员是否合法?这个代码演示了它:
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*
};
是的,这是合法的。我不会评论这是否可取。
首先,您需要能够在派生类中重新声明具有相同名称的不同实体;这是3.3.10/1允许的(我强调):
可以通过嵌套声明性区域或派生类中相同名称的显式声明来隐藏名称。
那么您需要T
在Derived::T
的声明中引用Base::T
;即CCD_ 4在该点一定不在范围内。范围由3.3.3/1:定义
它的潜在作用域从声明点开始,到块的末尾结束。
申报点由3.3.2/1定义:
名称的声明点紧接在其完整声明符之后
这意味着在声明符之前和期间,Derived::T
不在作用域中,因此T
指的是Base::T
。
我相信这是合法的(typedef
肯定是按照它们出现的顺序处理的),但对于将来试图阅读代码的人来说,这将是非常令人困惑的。
将次要类型重命名为会更有意义
typedef T *Tptr;
Tptr m2;