我遇到了下面的声明
template <class charT, class traits = char_traits<charT> >
class basic_istream;
我的疑问是:依赖class traits = char_traits<charT>
部分的目的是什么,当我们只用
template <class charT, class traits >
如果使用后者我们确认允许任何类型作为第二个模板参数,那么我们为什么要选择另一个?
答案 0 :(得分:0)
是的,你可以。
basic_istream<char, char_traits<char> >;
答案 1 :(得分:0)
当你说
时template<class T = Something>
使用默认参数声明模板参数T
- 也就是说,可以提供或不提供参数。如果未提供,则使用Something
。但你仍然可以明确地提供它,使其成为别的东西。
所以声明
template <class charT, class traits = char_traits<charT> >
class basic_istream;
basic_istream
的作者允许您声明类似basic_istream<SomeCharT>
的内容,而不必费心提供第二个模板参数,并为您计算合理的参数。但如果你愿意,他们仍允许你说basic_istream<SomeCharT, SomeOtherCharTraits>
。
答案 2 :(得分:0)
通过取消上述类型,我们确认允许任何类型,那么我们为什么要选择其他类型
在这两种情况下,我们允许第二个模板参数(traits
)的任何类型,但在第一种情况下,如果未表达的第二个类型,我们也给出一个默认值。
所以,定义,
template <typename A, typename B = int>
class foo;
类型为foo<std::string, int>
的对象可以通过以下两种方式声明
foo<std::string> f0;
foo<std::string, int> f1;
如果您声明foo
没有第二个模板参数的默认值
template <typename A, typename B>
class foo;
您只能声明一个foo
对象来解释两个模板参数
// foo<std::string> f0; <-- error now
foo<std::string, int> f1;