代码之家  ›  专栏  ›  技术社区  ›  Trevor Robinson

从从属基类访问类型

  •  10
  • Trevor Robinson  · 技术社区  · 17 年前

    有人知道为什么使用声明似乎不适用于从依赖的基类导入类型名吗?它们适用于成员变量和函数,但至少在GCC4.3中,它们似乎被类型忽略了。

    template <class T>
    struct Base
    {
      typedef T value_type;
    };
    
    template <class T>
    struct Derived : Base<T>
    {
      // Version 1: error on conforming compilers
      value_type get();
    
      // Version 2: OK, but unwieldy for repeated references
      typename Base<T>::value_type get();
    
      // Version 3: OK, but unwieldy for many types or deep inheritance
      typedef typename Base<T>::value_type value_type;
      value_type get();
    
      // Version 4: why doesn't this work?
      using typename Base<T>::value_type;
      value_type get(); // GCC: `value_type' is not a type
    };
    

    我有一个基类,其中包含一组分配器样式的typedef,我希望在继承的各个级别中继承这些typedef。到目前为止,我发现最好的解决方案是上面的版本3,但我很好奇为什么版本4似乎不起作用。GCC接受使用声明,但似乎忽略了它。

    我已经检查了C++标准,C++ + PROG。Lang.第三Ed.[StruouStrup ]和C++模板[Vandevoorde,Jojuts],但似乎没有一个解决使用声明是否可以应用于依赖基类类型的问题。

    如果它有助于看到另一个例子, here is the same question being asked 但在GCC邮件列表中没有真正回答。询问者表示他在其他地方看到过“使用类型名”,但GCC似乎不支持。我没有另一个合格的编译器来测试它。

    2 回复  |  直到 13 年前
        1
  •  9
  •   Trevor Robinson    14 年前

    正如Richard Corden指出的,这个问题是在 C++ Standard Core Language Defect Reports 2003年标准批准后: How do the keywords typename/template interact with using-declarations?

    拟议决议(2003年4月, 2003年10月修订):

    将新段落添加到 7.3.3[命名空间.udecl]:

    如果using声明使用 关键字typename并指定 从属名称(14.7.2[温度差]), 由 使用声明被视为 typedef名称(7.1.3[dcl.typedef])。

    2003年10月15日起,第二版标准中似乎没有出现此文本。

    GCC尚未实施该决议,如中所述。 bug 14258 :

    ——乔瓦尼·巴乔的评论3,2004-02-27,12:47[回复]——The 问题是我们使用的decl没有 记录“类型名”,即 事实上,它是一种 通过它导入。这个以前有用 由于隐式类型名 我想可以延期。

    复制品 bug 21484 指示“使用typename”适用于comeau和intel编译器。因为msvc将所有名称视为依赖项,所以该编译器不需要(但允许)构造。


    Fixed 在2011年12月13日的GCC4.7中!

        2
  •  -2
  •   Stephen C. Steel    17 年前

    在为base::value_类型声明typedef之前,您没有在base的模板中包含访问说明符(public/protected/private)。因此,它默认为private,并且在从base派生的类中不可访问。

    推荐文章