代码之家  ›  专栏  ›  技术社区  ›  Georg Fritzsche

一个班级的全球资格

  •  3
  • Georg Fritzsche  · 技术社区  · 16 年前

    我们发现类似于以下内容(不要问……):

    namespace N {
        struct A { struct B; };
    }
    
    struct A { struct B; };
    
    using namespace N;
    
    struct ::A::B {}; // <- point of interest
    

    有趣的是,这在VS2005、ICC11.1和Comeau(在线)中编译得很好,但在GCC中编译失败:

    类名的全局限定在“{”标记之前无效

    • 这个 class-head nested-name-specifier 和 identifier
    • 嵌套名称说明符 不能从全球资格开始( :: )
    • 显然,两者都不能

    ... 还是我忽略了什么?

    1 回复  |  直到 16 年前
        1
  •  8
  •   jotik    10 年前

    我认为你说得对:在本例中,GCC严格执行标准,而其他人则执行得不那么严格(请看一看) issue #355 ).

    struct identity< ::A >::type::B {}; 
    

    typedef

    typedef ::A AHidden;
    struct AHidden::B { };
    

    当然,你也可以交换 using namespace 以及嵌套类定义。请注意,附录A仅供参考。规范性文本为at条款 5.1/7 和 9 .