以下代码是否有效?
struct A
{
struct nested;
};
struct B : public A {};
struct B::nested {};
gcc接受它,但是clang拒绝它并出现以下错误:
test.cpp:8:14: error: no struct named 'nested' in 'B'
class B::nested {};
~~~^
答案 0 :(得分:6)
第9节第11段,强调我的:
如果 class-head-name 包含嵌套名称说明符, class-specifier 应引用一个类以前直接在嵌套名称说明符引用的类或命名空间中声明,或者在该命名空间的内联命名空间集(7.3.1)的元素中声明(即,不仅仅是由 using-declaration 继承或引入,而且 class-specifier 应出现在包含前一个声明的命名空间中。在这种情况下,定义的 class-head-name 的嵌套名称说明符不应以 decltype-specifier 开头。
在您的示例中, class-head-name 是令牌B::nested
,其中包含嵌套名称说明符 B::
和 class-name nested
。 类说明符是整个struct B::nested {
... }
。
答案 1 :(得分:1)
B没有名为nested
的嵌套类。只有A有一个名为nested
class A::nested { };
的嵌套类应该可以正常工作
答案 2 :(得分:0)
您继承自A
,因此您未在nested
中封装B
结构。
从创建的类型为B
的结构中,您只能到达结构nested
,因为它是结构B
的一部分,但构造名为nested
的结构体负责A
1}},因为它封装了nested
。
所有代码都无效。