C++不允许在模板中使用默认参数

C++ default parameter in template not allowed?

本文关键字:默认 参数 不允许 C++      更新时间:2023-10-16

在我的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)

原因是默认函数参数不能用于推断模板参数的类型。