gpt4 book ai didi

c++ - 被多重继承隐藏的嵌套类

转载 作者:可可西里 更新时间:2023-11-01 18:40:00 25 4
gpt4 key购买 nike

此代码是否适用于 C++(11)?

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

typedef Derived3::nested<int> xxx;

我所知道的

上面的代码编译失败:

  • 苹果 LLVM 5.0 (clang-500.2.75)
  • clang 3.4

但它成功编译:

  • gcc 4.9.0 20131110(实验版)
  • 海湾合作委员会 4.8

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

struct Base {
struct nested;
};
...
typedef Derived3::nested xxx;

然后它可以与上述编译器一起工作。

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

template <typename> struct dependent { struct type; };
struct Base {
template <typename T>
using nested = typename dependent<T>::type;
};

使用上述编译器产生相同的结果。[结束编辑]

来自 N3242 §10.1 [class.mi]

A class can be an indirect base class more than once and can be a direct and an indirect base class. There are limited things that can be done with such a class. The non-static data members and member functions of the direct base class cannot be referred to in the scope of the derived class. However, the static members, enumerations and types can be unambiguously referred to.

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

最佳答案

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

它不明白为什么定义会模棱两可,因为你谈论的是类型而不是成员,如果它们的名称在 C++ 中相等,则类型相等(名称是涉及的类型的某种变形形式等)

附录:

如果“嵌套”和“嵌套”在另一个基础上不同,那就错了。它是一个结构,而不是 typedef 或 using(有作用域)

如果有什么不明确的地方,GCC 会发牢骚,如果你想让它变得很糟糕,即使它不明确,也可以尝试使用 -pedantic。即使 GCC 只是宽容,我也看不出为什么要拒​​绝它。

关于c++ - 被多重继承隐藏的嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19986123/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com