[英]C++ default parameter in template not allowed?
在我的C ++代码中,我这样编写:
template <typename T, typename Pred>
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = std::less<T>())
{
return p(lhs, rhs) ? lhs : rhs;
}
但是,当我打电话给BestOfTwo(3,5)时,这不起作用 。 编译器告诉我没有匹配的重载实例。 所以现在我必须这样写:
template <typename T, typename Pred = std::less<T> >
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = Pred())
{
return p(lhs, rhs) ? lhs : rhs;
}
当我打电话给BestOfTwo(3,5)时,这没有任何错误。 但我认为之前的风格更方便,我也没想出它出错的地方。 有什么建议吗?
只有第二个版本是正确的(如果您不想手动指定Pred
参数),但仅限于C ++ 11。 Angew已经有一个答案,澄清了为什么第一个版本不正确,没有Pred
参数的规范。
如果您不能使用C ++ 11,您应该编写两个重载(一个使用Pred
,一个不使用,使用std::less
),因为在C ++ 98中明确禁止函数模板的默认模板参数。
template<typename T, typename Pred>
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = Pred())
{
//
}
template<typename T>
inline const T BestOfTwo(const T& lhs, const T& rhs)
{
return BestOfTwo<T, std::less<T> >(lhs, rhs);
}
如果您明确指定了模板参数,则第一个版本将起作用:
BestOfTwo<int, std::less<int>>(3, 5)
原因是默认函数参数不能用于推导模板参数的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.