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)
原因是默认函数参数不能用于推断模板参数的类型。
相关文章:
- 如何使用默认参数等选择模板专业化
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 何时提供默认参数作为模板参数
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 如何修复带有 clang 的参数'args'缺少默认参数的问题?
- 函数不接受 X 参数,函数使用默认参数
- initializer_list具有默认参数的构造函数
- C++ 带有默认参数的结构,可选择在构造函数中更改
- 为什么C++构造函数在继承中需要默认参数?
- 必须非常量别名参数及其默认参数常量
- C++ 默认参数使用其他参数
- 组合函数参数包和默认参数
- 如何定义 Vector2f 的默认参数?[SFML]
- 有条件地将默认参数传递给函数(使用"?"运算符)
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 如何设置默认参数以防用户不输入另一个参数
- 结构 c++ 中的默认参数
- 构造函数委托与默认参数
- 默认参数和函数指针作为函数参数C++
- 如何在继承层次结构中调用具有默认参数的构造函数?