使用基类并从中重新定义typedef
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*
};
是的,这是合法的。我不会评论这是否可取。
首先,您需要能够在派生类中重新声明具有相同名称的不同实体;这是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;
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 如何重新定义MPI_FLOAT,MPI_DOUBLE以 typedef 的方式
- 使用LASlib时BOOL typedef重新定义
- "typedef"类型名称是否可以像"struct"定义那样声明指向结构的指针?
- 具有未声明/未定义类型的 typedef 结构
- typedef 应该同时在类定义和类声明中吗?
- 定义 ostream 运算符<<用于类中定义的 typedef
- 模板化类,包含由 typedef 定义的类对象的向量.如何称呼它们
- C 通过Typedef定义新类型
- Typedef已定义的功能
- typedef 中的自定义类型为 Qt MetaType
- 错误:使用不同类型的 Typedef 重定义
- 带有STD ::向量的模板Typedef具有自定义分配器
- 在Visual Studio中定义与Typedef枚举发生冲突的原因是什么?
- 如何比较/排序包含自定义 typedef 的列表容器的元素
- 如何为联合成员定义typedef
- 为函数定义 typedef,该函数返回指向类似自身的函数的函数指针
- 在本地范围内重新定义typedef
- 定义Typedef?(UDP数据包)
- 使用基类并从中重新定义typedef