void new_doubles(double a, double b, double c)
{
double d=max(abs(a), abs(b), abs(c));
cout<<d;
}
产生此编译时错误:
In file included from /usr/local/gcc4.9.0/include/c++/4.9.0/bits/char_traits.h:39:0,
from /usr/local/gcc4.9.0/include/c++/4.9.0/string:40,
from /usr/local/gcc4.9.0/include/c++/4.9.0/stdexcept:39,
from /usr/local/gcc4.9.0/include/c++/4.9.0/array:38,
from std_lib_facilities_4.h:27,
from hw4pr4.cpp:1: /usr/local/gcc4.9.0/include/c++/4.9.0/bits/stl_algobase.h: In instantiation of ‘const _Tp& std::max(const _Tp&, const _Tp&, _Compare) [with _Tp = double; _Compare = double]’:
hw4pr4.cpp:35:36: required from here
/usr/local/gcc4.9.0/include/c++/4.9.0/bits/stl_algobase.h:264:26: error: ‘__comp’ cannot be used as a function
if (__comp(__a, __b))
我不明白为什么会产生这个错误,任何人都可以帮助解释我做错了什么?
答案 0 :(得分:5)
带有三个参数的唯一重载std::max
用于给出前两个中较大的一个,将第三个解释为比较函数而不是<
来比较值。它没有给出三个值中最大的值。
要获取三个值中的最大值,请使用带有初始化列表的重载:
double d=max({abs(a), abs(b), abs(c)});
^ ^
或者,如果你陷入了前C ++ 11世界,那么两次调用重载两次:
double d=max(abs(a), max(abs(b), abs(c)));
^^^^ ^
答案 1 :(得分:1)
Max不会以您认为的方式采用三个参数。
double d=max(max(abs(a), abs(b)), abs(c));
答案 2 :(得分:0)
@GWW是正确的,但如果您使用的是C ++ 11编译器,则会有一个新的可变参数 - 您需要提供一个带有多个args而不是多个args的初始化列表:
void new_doubles(double a, double b, double c)
{
double d = max( { abs(a), abs(b), abs(c) } );
cout << d;
}