多重继承隐藏的嵌套类

Lou*_*nne 7 c++ gcc multiple-inheritance clang nested-class

这段代码是否有效C++(11)?

struct Base {
    template <typename>
    struct nested;
};
struct Derived1 : Base { };
struct Derived2 : Base { };
struct Derived3 : Derived1, Derived2 { };

typedef Derived3::nested<int> xxx;
Run Code Online (Sandbox Code Playgroud)

我知道的

上面的代码无法编译:

  • Apple LLVM 5.0(clang-500.2.75)
  • Clang 3.4

但它成功编译:

  • gcc 4.9.0 20131110(实验性)
  • gcc 4.8

此外,如果我将nested类型更改为非模板类​​型,即

struct Base {
    struct nested;
};
...
typedef Derived3::nested xxx;
Run Code Online (Sandbox Code Playgroud)

然后它适用于上述编译器.

[edit]nested模板结构更改为模板别名也不会改变任何内容;

template <typename> struct dependent { struct type; };
struct Base {
    template <typename T>
    using nested = typename dependent<T>::type;
};
Run Code Online (Sandbox Code Playgroud)

与上述编译器产生相同的结果. [结束编辑]

来自N3242§10.1[class.mi]

类可以是多个间接基类,可以是直接基类和间接基类.这类课程可以做的事情有限.直接基类的非静态数据成员和成员函数不能在派生类的范围内引用.但是,可以明确地引用静态成员,枚举和类型.

认为这意味着代码应该是有效的,但我不确定.

Ale*_*eal 0

很好,GCC 要么是正确的,要么更有帮助(它非常严格地遵守标准)

它不明白为什么定义会含糊不清,因为你谈论的是类型而不是成员,并且如果它们的名称在 C++ 中相等,则类型是相等的(名称是所涉及类型的某种损坏形式等)

附录:

如果“嵌套”和另一个基地的“嵌套”不同,那就是错误的。它是一个结构体,而不是 typedef 或 using (它们是有作用域的)

如果某些内容不明确,GCC 会发出抱怨声,如果你想让它变得很糟糕,即使它不明确,也可以尝试使用 -pedantic。即使海湾合作委员会只是宽容,我认为没有理由拒绝这一点。