我们发现类似于以下内容(不要问......):
namespace N {
struct A { struct B; };
}
struct A { struct B; };
using namespace N;
struct ::A::B {}; // <- point of interest
有趣的是,这与VS2005,icc 11.1和Comeau(在线)编译良好,但与GCC失败:
类名的全局限定在'{'标记
之前无效
从C ++ 03,附件A,我觉得GCC是对的:
class-head
可以包含nested-name-specifier
和identifier
nested-name-specifier
无法以全球资格认证(::
)identifier
......或者我忽略了什么?
答案 0 :(得分:7)
我认为你做得对:GCC在这种情况下实现了标准,而其他人则不那么严格(看看issue #355)。
您可以执行以下操作来解决语法限制
struct identity< ::A >::type::B {};
或者您使用明确的名为typedef
typedef ::A AHidden;
struct AHidden::B { };
或者,当然,您可以交换using namespace
的顺序和嵌套的类定义。请注意,附件A仅供参考。规范性文本位于条款5.1/7
和9
。