在父类中定义子类的子结构

请考虑以下代码段:

class MyClass
{
private:
    struct Privateclass
    {
        struct SubStruct;
    };

public:
    struct Privateclass::SubStruct {};

private:
    Privateclass::SubStruct member;
};

MSVC和gcc编译此代码没有任何错误。但是,clang会产生以下错误:

<source>:10:26: error: non-friend class member 'SubStruct' cannot have a qualified name
    struct Privateclass::SubStruct {};

那么,谁是对的?这是叮当声的错误吗?

raytacer 回答:在父类中定义子类的子结构

根据C ++ 17标准中的[class]/11

  

如果类头名称包含嵌套名称说明符,则   class-specifier应引用先前声明的类   直接在嵌套名称说明符所指向的类或名称空间中   引用,或在其内联名称空间集(10.3.1)的元素中   命名空间(即,不仅是由   using-declaration),和类说明符应出现在   包含前一个声明的名称空间。在这种情况下,   定义的类头名称的嵌套名称说明符   不是以decltype-specifier开头。

因此,似乎clang编译器是正确的。

,

标准(最新草案)说:

  

[class.nest]

     

如果在命名空间范围内定义了类X,则嵌套的类Y可以在类X中声明,然后在类X的定义中定义,或者稍后在包含类X的定义的名称空间范围中定义。

在此示例中,在类SubStruct中声明的类PrivateClass既没有在以后的PrivateClass中也没有在命名空间范围内定义(而是在以后的类中)定义外部MyClass的范围)。 PrivateClass本身也没有在名称空间范围内定义。

除非另有一条规则允许这样做,否则至少不明确允许示例中的子嵌套类的定义。 lang似乎是正确的。

本文链接:https://www.f2er.com/3102239.html

大家都在问