c++ - C ++:是否定义了具有相同名称的typedef嵌套类型的行为?
问题描述
编码:
class Global
{
public:
static const char *name() {return "Global";}
};
typedef Global T_Outter;
class Outter
{
public:
typedef T_Outter O_Outter; // <= <1>
typedef Outter T_Outter; // <= <2>
static const char *name() {return "Outter";}
static void test() {printf("self: %s, outter: %s\n", name(), O_Outter::name());}
class Inner
{
public:
typedef T_Outter O_Outter;
typedef Inner T_Outter;
static const char *name() {return "Inner";}
static void test() {printf("self: %s, outter: %s\n", name(), O_Outter::name());}
};
};
Outter::test();
Outter::Inner::test();
// output:
// self: Outter, outter: Global
// self: Inner, outter: Outter
我想做的事:
- 在不知道它的实际父类或范围的情况下获取嵌套类信息
typedef
s 将由宏生成,有了技巧,不需要手动“绑定”和Outter
'Inner
的关系,它是由typedef
自动完成的
这是问题:
- 它是在上面的代码中定义的行为吗?
<1>
并且<2>
同名T_Outter
_Outter::O_Outter
等于Global
Outter::Inner:O_Outter
等于Outter
- 使用技巧是否便携?
解决方案
在类定义中使用不合格的全局名称后,不允许更改类中的全局名称的含义。该程序格式错误,NDR。
N
类中使用的名称S
应在其上下文中引用相同的声明,并且在完成的范围内重新评估时S
。违反此规则不需要诊断。
GCC 10 的现场演示:
error: declaration of 'typedef class Outter Outter::T_Outter' changes meaning of 'T_Outter' [-fpermissive]
一种可能的解决方法是对其进行限定:
class Outter {
public:
typedef ::T_Outter O_Outter;
typedef Outter T_Outter; // OK
. . .
推荐阅读
- ios - SWIFTUI:更改 ScreenSize 类后无法关闭工作表
- javascript - 正则表达式执行和测试行为不同
- kotlin - 用户在 Kotlin 中的 editText 上键入时如何调用 recyclerview
- mysql - 谁能告诉我如何解决这些错误?
- react-native - React Native - 使用 Facebook 登录 - 出现旧应用名称
- java - 如何使用 Spring MVC 在 JSP 页面中的 DataTable 中实现服务器端处理?
- css - 如何在 input[type] 上覆盖 CSS 类?
- python - 将 AWS 凭证传递给 Google Cloud Dataflow、Python
- php - 为什么 OpenCart 3 中的图像不能通过管理面板加载?
- android - WebView 突然关闭