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