繁体   English   中英

模板中的C ++默认参数不允许?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM