2011-11-11 54 views
4

在gcc庫中,basic_stringbuf模板是從basic_streambuf派生的。在基類basic_streambuf中,類型名稱(如char_type,traits_type)已經聲明。爲什麼在子類basic_stringbuf中聲明它們是重複的?爲什麼在gcc庫中重複聲明同一類型

相關代碼粘貼在下方。

// 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' 
}; 

回答

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 
相關問題