2015-05-14 33 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;