为什么在gcc库中声明了相同类型的重复

时间:2011-11-11 12:54:55

标签: c++

在gcc库中,模板basic_stringbuf派生自basic_streambuf。在基类basic_streambuf中,已经声明了类型名称,例如char_type,traits_type。为什么在子类basic_stringbuf中声明它们是重复的?

相关代码粘贴在下面。

// c++/4.2.1/streambuf
template<typename _CharT, typename _Traits>
    class basic_streambuf 
    {
    public:
      //@{
      /**
       *  These are standard types.  They permit a standardized way of
       *  referring to names of (or names dependant on) the template
       *  parameters, which are specific to the implementation.
      */
      typedef _CharT                    char_type;
      typedef _Traits                   traits_type;
      typedef typename traits_type::int_type        int_type;
      typedef typename traits_type::pos_type        pos_type;
      typedef typename traits_type::off_type        off_type;
      //@}

      //@{
      /**
       *  @if maint
       *  This is a non-standard type.
       *  @endif
      */
      typedef basic_streambuf<char_type, traits_type>   __streambuf_type;
      //@}
…
};

// c++/4.2.1/sstream
template<typename _CharT, typename _Traits, typename _Alloc>
    class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
    {
    public:
      // Types:
      typedef _CharT                    char_type;
      typedef _Traits                   traits_type;
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 251. basic_stringbuf missing allocator_type
      typedef _Alloc                        allocator_type;
      typedef typename traits_type::int_type        int_type;
      typedef typename traits_type::pos_type        pos_type;
      typedef typename traits_type::off_type        off_type;

      typedef basic_streambuf<char_type, traits_type>   __streambuf_type;
      typedef basic_string<char_type, _Traits, _Alloc>  __string_type;
      typedef typename __string_type::size_type     __size_type;
…
};

更新

char_type已在父类中声明为公共成员。子类可以直接使用它。我的问题是为什么gcc不实现basic_stringbuf,如下所示

template<typename _CharT, typename _Traits, typename _Alloc>
    class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
    {
    public:
      // Types:
      //typedef _CharT                  char_type;
      //typedef _Traits                     traits_type;
      // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 251. basic_stringbuf missing allocator_type
      typedef _Alloc                        allocator_type;
      //typedef typename traits_type::int_type      int_type;
      //typedef typename traits_type::pos_type      pos_type;
      //typedef typename traits_type::off_type      off_type;

      typedef basic_streambuf<char_type, traits_type>   __streambuf_type;
      typedef basic_string<char_type, _Traits, _Alloc>  __string_type;
      typedef typename __string_type::size_type     __size_type;
…
};

修改

谢谢K-ballo。我认为你的答案是有道理的。我试过下面的代码。类型名称char_type不能在子类中使用。

template<typename _CharT>
class Base
{
public:
    typedef _CharT char_type; 
};

template<typename _CharT>
class Child : public Base<_CharT>
{
private:
    char_type _M_Data; // FAIL: Unknown type name 'char_type'
};

1 个答案:

答案 0 :(得分:2)

你尝试过这样做吗?基类basic_streambuf<_CharT, _Traits>是一个依赖类型,在实例化实例化之前,编译器将不知道此基数的basic_streambuf(如果有)的特化。因此,基类的定义在派生类中不可见。为了使在依赖基类中声明的类型可见,通常是typedef typename base_class::some_type some_type;,gcc只是决定再次重新定义它们,就像基数一样。

它简化为char_type,尽管在父类中声明为公共成员,但不能直接由子类使用。它必须用它作为

 typename basic_streambuf< _CharT, _Traits >::char_type