首页 > 解决方案 > 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

我想做的事:

这是问题:

标签: c++typedef

解决方案


在类定义中使用不合格的全局名称后,不允许更改类中的全局名称的含义。该程序格式错误,NDR。

[basic.scope.class]/2

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
    . . .

推荐阅读