功能重载问题

时间:2017-10-30 22:26:36

标签: c++ overloading

我正在尝试创建一个程序,我在其中重载函数以找到2,3或4个参数之间的最大值。我的代码目前看起来有点不稳定,每当我运行它时,我会收到“#include”下的可怕红线和三个参数函数调用。当我禁用它时,2和4参数都很好,但是我的3参数是不好的。你们其中一个人会介意看看它并尝试提供帮助吗?谢谢!

#include <cstdlib>
#include <iostream>

using namespace std;


double max (double, double, double, double);


int main(int argc, char** argv) {

double result;

result = max(10.0, 20.0);
cout << "Max(10.0, 20.0) = " << result << endl;
result = max(11.5, 21.2, 5.3);
cout << "Max(11.5, 21.2, 5.3) = " << result << endl;
result = max(1.8, 2.2, 1.7, 2.1);
cout << "Max(1.8, 2.2, 1.7, 2.1) = " << result << endl;
return 0;


}

double max(double a, double b)
{
if (a > b)
    return a;
else 
    return b;
}

double max(double a, double b, double c)
{
if (a > b && a > c)
    return a;

else if (b > a && b > c)
    return b;

else
    return c;
}

double max(double a, double b, double c, double d)
{
if (a > b && a > c && a > d)
    return a;
else if (b > a && b > c && b > d)
    return b;
else if (c > d)
    return c;
else 
    return d;
}

3 个答案:

答案 0 :(得分:2)

摆脱using namespace std;,否则会导致您的职能与std::max之间产生歧义。

一般来说,using namespace stdconsidered bad practice,会导致问题,就像您看到的一样。

答案 1 :(得分:2)

在使用之前,您尚未使用三个参数声明重载。

添加

double max(double, double, double );
在你打电话之前

在使用之前,您还应该使用两个参数版本声明重载,但最终会从标准库中选择一个版本。摆脱

using namespace std;

也应该检测到这个问题。

答案 2 :(得分:2)

按原样,这不会编译。您正在将std命名空间引入当前范围,但在VS实施上不会调用std::max,而Linux GCC实施时会有一个,显然是通过{{1}标题:

  

/ usr / local / include / c ++ / 7.2.0 / bits / stl_algobase.h:在实例化中   'constexpr const _Tp&amp; std :: max(const _Tp&amp;,const _Tp&amp;,_Compare)[with   _Tp =双倍; _Compare = double]':

stl_algobase.h函数之前提供所有三个函数声明:

main()

Live example on Coliru

话虽如此,不要使用double max(double, double); double max(double, double, double); double max(double, double, double, double); int main() { // same as before } 声明。