【问题标题】:Is 'typedef' automatically inherited in C++ class?'typedef' 是否在 C++ 类中自动继承?
【发布时间】:2016-09-09 10:44:09
【问题描述】:

我曾经相信'typedef' 不会自动继承。但是下面的代码快照暗示了一些不同的东西。

#include <iostream>
#include <type_traits>

struct A
{
    typedef int X;
};

struct A_ 
{
    typedef char X;
};

struct B : A {};
struct B_ : A, A_ {};

template< typename ... Ts >
using void_t = void;

template< typename T, typename = void >
struct has_typedef_X : std::false_type {};

template< typename T >
struct has_typedef_X< T, void_t<typename T::X> > : std::true_type {};

int main()
{
    std::cout << std::boolalpha;
    std::cout << has_typedef_X<A>::value << std::endl;
    std::cout << has_typedef_X<A_>::value << std::endl;
    std::cout << has_typedef_X<B>::value << std::endl;
    std::cout << has_typedef_X<B_>::value << std::endl;
    return 0;
}

输出是“真真真假”。 但在我看来,'has_typedef_X&lt;B&gt;::value' 给出 'true' 意味着在结构 B 中,X 是 'typedef'ed。

那么如果有人能解释一下这个问题或纠正我吗?

在线版本可在http://melpon.org/wandbox/permlink/iwZ6eZ3PoBPgyFBj [URL 更正]

【问题讨论】:

  • T::XB_ 中不明确,因此false,您的链接似乎已损坏
  • @PiotrSkotnicki 谢谢。我已经更新了网址。我的问题是 struct B,我曾经认为其中没有 X 类型定义。
  • “我以前认为'typedef'不会自动继承。”嗯,错了。

标签: c++ c++11


【解决方案1】:

父类的嵌套类型名称(即成员类型)在派生类的范围内是可见的,并且只要访问说明符 of 不是私有的就可以访问。如果不同基类中有多个同名的类型,那么非限定名称是不明确的。

我发现的最相关的标准引用是:

[class.nested.type] §1

类型名称遵循与其他名称完全相同的范围规则。 [...]

[class.member.lookup] §9

[ 注意:即使一个对象有多个基类,也可以明确地找到定义在基类 T 中的静态成员、嵌套类型或枚举器 T 类型的子对象。[...]

事实上,使用它的一个例子是标准,它指定标准容器的迭代器继承std::iterator模板,它只包含嵌套的类型名称。继承的重点是将这些嵌套的类型名称传递给迭代器。 (这个例子在下一个标准版本(c++17)中会过时,建议不再使用std::iterator。)

【讨论】:

    【解决方案2】:

    XBB_ 的范围内,B_ 的问题是B_::X 是模棱两可的,所以对于真实的has_typedef,模板推导失败,只留下虚假的匹配。

    【讨论】:

    • 这是否意味着 struct B 会自动从 struct A 继承 typedefed X?还是 X 不是 typedef?
    • @FengWang 只要 typedef 不是 private 或者基类不是模板,都可以。
    【解决方案3】:

    由于名称 X 由于在两个基类中定义而含糊不清,这会导致 has_typedef 中的 B_ 的模板推导失败。

    您认为 typedef 不被继承的观点可能来自于在不考虑基类的非限定名称查找期间的某些 C++ 特性。 见Propagating 'typedef' from based to derived class for 'template'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 2019-07-10
      • 2013-10-28
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      相关资源
      最近更新 更多