2013-07-29 3 views
0

Ниже приведен код, с которым я столкнулся. В строке avg += abs(num) есть ошибка, но я не могу ее решить. Код ошибки:Перегрузка 'abs (double &)' in "avg + = abs (num)"

error: call of overloaded 'abs(double&)' is ambigous 

Я понимаю, что это довольно простой, но в книге я использую «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; 
} 
+5

В чем Ваш вопрос? И что это? – Maroun

+0

Я получаю сообщение об ошибке при компиляции кода. Однако я не могу найти решение этой ошибки. Линия, в которой происходит ошибка, равна «avg + = abs (num)»; –

+1

Что вы компилируете и как? Ваш код компилируется и работает для меня. – DUman

ответ

4

Вы не включая правильный заголовок для плавающей запятой перегрузок std::abs:

#include <cmath> 
+0

Книга никогда не включала это. Означает ли это, что книга может быть неправильной? –

+0

@ пользователь2583389: Да; если книга не включает это, то это неправильно. (Обратите внимание, что у автора есть немного репутации для написания бедных книг, поэтому я не удивлюсь, если это не очень хорошо. Вы можете найти [эти рекомендации] (http://stackoverflow.com/questions/ 388242) полезный вместо этого.) –

+0

спасибо. –

3

Код этой книги:

#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; 
} 

Я нашел его на копии этой книги ...

И std::abs вы должны включать в себя заголовок cmath:

#include <cmath> 

Документация: http://www.cplusplus.com/reference/cmath/abs/

EDIT: Но функция abs объявлена ​​в cstdlib имеет в качестве прототипа:

  int abs (   int n); 
    long int abs ( long int n); 
long long int abs (long long int n); 

Но в cmath:

 double abs (double x); 
     float abs (float x); 
long double abs (long double x); 
    double abs (T x); 

Но здесь, кажется, вы хотите работать с 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; 
} 
+0

Жестко закодированные числа, как вы делали с 5, являются злыми. Должна использоваться константа или, по крайней мере, #define. –

+0

@MartinPerry Просто скопируйте книгу :-) Конечно, это действительно плохо. Я согласен с вашей точкой! –

+0

@PierreFourgeaud +1 за попытку проверить код на книге :) –