C++ 在“平均值+=abs(num)”中重载“abs(double&)”

C++ 在“平均值+=abs(num)”中重载“abs(double&)”,c++,C++,下面是我遇到问题的代码。avg+=absnum行中有一个错误,但我无法解决它。错误代码: error: call of overloaded 'abs(double&)' is ambigous 我意识到它非常基本,但在Herbert Schildt的《我在使用C++:初学者指南》第二版中,这里使用的一个示例中的代码是相同的: #include <iostream> #include <cstdlib> using namespace std; int ma

下面是我遇到问题的代码。avg+=absnum行中有一个错误,但我无法解决它。错误代码:

error: call of overloaded 'abs(double&)' is ambigous
我意识到它非常基本,但在Herbert Schildt的《我在使用C++:初学者指南》第二版中,这里使用的一个示例中的代码是相同的:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    double num, avg;
    int x = 5;
    int i;

    avg = 0.0;

    for (i = 1; i <= x; ++i){

        cout << "Enter value " << i << ": ";
        cin >> num;

        avg += abs(num);

    }

    avg /= x;

    cout<< endl;
    cout << "The average is " << avg;
    return 0;
}

您没有为std::abs的浮点重载包含正确的标头:


本书的代码为:

#include <iostream>
#include <cmath>
//        ^^^^^

using namespace std;

int main()
{
    double num, avg; // The type is double not int !!!
  //^^^^^^
    int i;

    avg = 0.0;

    for (i = 0; i < 5; ++i){
       //    ^      ^

        cout << "Enter value : ";
        //                   ^^^^
        cin >> num;

        avg += abs(num);
    }

    avg /= 5;
    //     ^

    cout<< endl;
    cout << "The average is " << avg;
    return 0;
}
文件:

编辑:但cstdlib中声明的函数abs作为原型:

          int abs (          int n);
     long int abs (     long int n);
long long int abs (long long int n);
但在cmath中:

但在这里,您似乎希望使用double,如果不使用,您将丢失该值的小数部分:avg/=5。因此,cmath版本更适合。否则,您的代码应为:

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int num, avg;
  //^^^^^^
    int i;

    avg = 0;
    //    ^

    for (i = 0; i < 5; ++i){
        cout << "Enter value : ";
        cin >> num;
        avg += abs(num);
    }

    avg /= 5; // but you loose the decimal part...

    cout<< endl;
    cout << "The average is " << avg;
    return 0;
}

你的问题在哪里?那是什么?我编译代码时出错了。然而,我找不到解决这个错误的方法。发生错误的行是avg+=absnum;你在用什么编译,如何编译?您的代码可以编译并为我工作。@user2583389您正在评论中发布,在您的问题中发布更合适,如前所述。仔细检查后,代码很糟糕。它将avg声明为int,然后尝试将其用作double。包括cmath就足够的cstdlib。并在1而不是0处开始循环,这是没有充分理由的。如果该代码来自一本书,则需要另一本书。该书从未包含此代码。这是否意味着这本书可能是错的?@user2583389:是的;如果书中没有这一点,那就错了。请注意,作者有一点写不好的书的名声,所以如果这本书不是特别好,我也不会感到惊讶。您可能会发现有用的替代方法。在C++库的某些变体中,包含或包含恰好也会在头中拖动,这是不可能的。但是使用abs,应该让你的代码想在代码中添加include——总是包含你需要的一切——不管它是否在没有它的情况下编译。常量应该被使用,或者至少定义一下。@MartinPerry只是复制了这本书的粘贴:-当然这真的很糟糕。我同意你的观点@PierreFourgeaud+1用于检查书中的代码:
          int abs (          int n);
     long int abs (     long int n);
long long int abs (long long int n);
     double abs (double x);
      float abs (float x);
long double abs (long double x);
     double abs (T x);
#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    int num, avg;
  //^^^^^^
    int i;

    avg = 0;
    //    ^

    for (i = 0; i < 5; ++i){
        cout << "Enter value : ";
        cin >> num;
        avg += abs(num);
    }

    avg /= 5; // but you loose the decimal part...

    cout<< endl;
    cout << "The average is " << avg;
    return 0;
}