我有这段代码,我试图从传递的参数中获取最大的数字。由于某种原因它不起作用,我不确定为什么。当我输入 2 个数字时,代码有效,但当传递 3 个或更多时,我收到以下错误:
prog.cpp: 在函数'int main()'中:
prog.cpp:31:29: 错误: 没有匹配函数调用'max(int, int, int)'<br> prog.cpp:31:29:注意:候选人是:
prog.cpp:24:30:注意:模板 constexpr decltype (handle::helper::max(max::args ...)) max(Args ...)
prog.cpp:24:30 : 注意: 模板参数推导/替换失败:
prog.cpp: 替换'模板 constexpr decltype (handle::helper::max(args ...)) max(Args ...) [with Args = {int, int, int}]':
prog.cpp:31:29: 从这里需要
prog.cpp:24:30: 错误: 没有匹配函数调用'handle::helper::max(int&, int&, int&)' <br> prog.cpp:24:30: 注意: 候选人是: prog.cpp:11:18: 注意: static T handle::helper::max(T, T) [with T = int; Args = {int, int}]
prog.cpp:11:18: 注意: 候选人需要 2 个参数,提供 3 个
prog.cpp:16:18: 注意: 静态 T 句柄::helper::max(T, T, Args ...) [with T =诠释; Args = {int, int}]
prog.cpp:16:18: 注意:候选人需要 4 个参数,提供 3 个
这是程序:
#include <iostream>
namespace handle
{
template <typename... Args>
struct helper {};
template <typename T, typename... Args>
struct helper<T, Args...>
{
static T constexpr max(T x, T y)
{
return x > y ? x : y;
}
static T constexpr max(T x, T y, Args... args)
{
return max(x, max(y, args...));
}
};
}
template <typename... Args>
static auto constexpr max(Args... args) -> decltype(handle::helper<Args...>::max(args...))
{
return handle::helper<Args...>::max(args...);
}
int main()
{
std::cout << max(5, 3, 7); // fails
}
我真的很困惑,因为我以为我搞砸了。我做错了什么,我该如何解决?谢谢。
更新:感谢命名。由于这个问题现在已经解决,结果如下:
#include <type_traits>
#include <iostream>
namespace handle
{
template <typename T, typename V>
static auto constexpr max(T const& x, V const& y)
-> typename std::common_type<T, V>::type
{
return x > y ? x : y;
}
template <typename T, typename V, typename... Args>
static auto constexpr max(T const& x, V const& y, Args const&... args)
-> typename std::common_type<T, typename std::common_type<V, Args...>::type>::type
{
return max(x, max(y, args...));
}
}
template <typename... Args>
static auto constexpr max(Args const&... args) -> decltype(handle::max<Args...>(args...))
{
return handle::max<Args...>(args...);
}
int main()
{
std::cout << max(5, 3, 7.8, 2, 4, 55); // 55
}
谢谢大家!