2015-05-14 34 views
5

http://en.cppreference.com/w/cpp/string/basic_string找到的std :: basic_string文檔中,basic_string類聲明如下。瞭解如何聲明模板參數的默認值

template< 
    class CharT, 
    class Traits = std::char_traits<CharT>, 
    class Allocator = std::allocator<CharT> 
> class basic_string; 

但是,在GCC和Visual Studio中,Traits和Allocator模板參數的缺省值都未在類聲明中指定。

以下是來自GCC 4.9.2的basic_string.h。

template< 
    typename _CharT, 
    typename _Traits, 
    typename _Alloc 
> class basic_string 

請注意缺少_Traits和_Alloc模板參數的默認值。

我錯過了什麼?

回答

10

這些類通常在100萬個位置聲明。這些聲明中只有一個會帶有默認參數,否則就是錯誤。

對於basic_string,在的libstdC++,默認參數在一個前向聲明發現bits/stringfwd.h(其被包括在由<string>,除其他事項外):

template<typename _CharT, typename _Traits = char_traits<_CharT>, 
      typename _Alloc = allocator<_CharT> > 
    class basic_string; 

爲了不被從字面上理解。

+0

頭本身可以在https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01077_source.html找到。 –

2

在Visual Studio它在方式定義在開始專業化前:

template<class _Elem, 
    class _Traits = char_traits<_Elem>, 
    class _Ax = allocator<_Elem> > 
    class basic_string; 

「正常」 的字符串類型在typedef的後面定義爲std::string

typedef basic_string<char, char_traits<char>, allocator<char> > 
    string; 
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > 
    wstring;