问:为什么默认模板参数仅允许用于类模板?为什么不也适用于成员函数模板呢?
示例:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
根据 C ,默认模板参数仅对类模板有效。
A: 默认模板参数确实很有用。考虑一个排序函数:
<code class="cpp">template<typename Iterator, typename Comp = std::less< typename std::iterator_traits<Iterator>::value_type>> void sort(Iterator beg, Iterator end, Comp c = Comp()) { ... }</code>
但是,C 中当前限制的基本原理植根于该语言的早期,当时独立函数被认为不太重要。因此,他们需要从函数参数中推导所有模板参数,从而排除使用默认值。
此限制妨碍了代码灵活性以及与成员函数模板的兼容性。为了纠正这个问题,C 0x 为函数模板引入了默认模板参数。
正如 C 的创建者 Bjarne Stroustrup 在缺陷报告中所述:
“默认模板的禁止函数模板的参数是那个时代的错误残余,独立函数被视为二等公民,并要求所有模板参数从函数参数推导而不是指定。“
”该限制严重限制了编程风格不必要地使独立函数与成员函数不同,从而使编写 STL 风格的代码变得更加困难。”
以上是为什么 C 中的类模板只允许使用默认模板参数?的详细内容。更多信息请关注PHP中文网其他相关文章!