Программа не скомпилирована

0

Вот мой код. Я использую Dev-С++ 4.9.8.0, и я не могу понять, почему это не скомпилируется.

#include <iostream>
#include <cmath>
#include <stdlib.h>

using namespace std;

int main() {
    int  n;    // Number to test for prime-ness
    int  i;    // Loop counter
    int  is_prime = true; // Boolean flag...
                          // Assume true for now.

    // Get a number form the keyboard.

    cout << "Enter a number and press ENTER: ";
    cin >> n;

    // Test for prime by checking for divisibility 
    // by all whole numbers from 2 to sqrt(n).

    i = 2;
    while (i <= sqrt(n)) {  // While i is <= sqrt(n),
         if (n % i == 0)         // If i divides n, 
             is_prime = false;   //    n is not prime.
         i++;
 }

 // Print results

 if (is_prime)
     cout << "Number is prime." << endl;
 else
     cout << "Number is not prime." << endl;

 system("PAUSE");   
 return 0;
}

Im получает различные сообщения об ошибках перегрузки. Может кто-то, пожалуйста, помогите мне понять, почему он не компилируется правильно.

  • 8
    Попробуйте опубликовать сообщения об ошибках, которые вы видите.
  • 3
    С одной стороны, <stdlib.h> должен быть либо <cstdlib> , либо вы должны <cstdlib> скобки, которые включают в себя extern "C"
Показать ещё 20 комментариев
Теги:

2 ответа

9

Как и было предсказано, ошибка является результатом столкновения символа между std::sqrt и sqrt, из-за использования вами using namespace std; ,

Заголовок cmath имеет функцию std::sqrt, а имя символа sqrt импортируется в ваше пространство имен из-за using namespace std; , Несмотря на то, что вы не включаете math.h, по какой-то причине ваш компилятор также импортирует этот заголовок, а math.h определяет функцию sqrt.

Компилятор жалуется, что он не знает, какой sqrt использовать.

Правильное решение этого - не использовать using namespace std; , См. Также: Почему "использование пространства имен std" считается плохой практикой? ,

В вашем конкретном случае вы можете заменить using namespace std; со следующим:

using std::cout;
using std::cin;
using std::endl;

чтобы не набирать std:: перед ними все время.

Честно говоря, компилятор не должен включать в себя math.h, и, как указывали другие, использование компилятора 10+ года просто глупо. Используйте современный компилятор.

Изменить: Кроме того, пожалуйста, никогда больше не отправляйте полдюжины комментариев подряд, чтобы передать сообщение с несколькими линиями. Просто отредактируйте исходный пост.

  • 1
    Но если вы хотите использовать пространство имен std, вы можете попробовать ::sqrt(n) , std::sqrt(n) или sqrt<>(n) .
  • 2
    Другая альтернатива - вообще не использовать sqrt , что полностью исключило бы необходимость в cmath . пример
Показать ещё 1 комментарий
0

Это компилируется в gcc.

Хотя некоторые из них можно улучшить, например, не включая #include <stdlib.h> включая stdlib вместо stdlib.h и making is_prime bool.

строка 22 вызов перегруженного "sqrt (int &)" неоднозначен

try sqrt<int>(n) или sqrt((int) n)

@Andrey дает вам ответ: используйте ::sqrt(n) или std::sqrt(n) или math.h вместо cmath. Лучше всего по-прежнему, как он предлагает: не используйте using namespace std; ,

Мой совет: переключитесь на более простой компилятор, такой как gcc, clang или Visual Studio. Они лучше соответствуют стандарту.

Книга, которую я использую, использует Dev-С++

Я не хочу быть злым, но переключаюсь на другую книгу. Я бы не стал доверять книге, которая заставит вас включить stdlib.h. Это заголовок с того времени, когда C еще не был стандартизирован. Итак... да... переключите книгу...

  • 0
    Отказ от включения <stdlib.h> не является улучшением, пока сохраняется вызов system .
  • 0
    о да извините не видел system вызов
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню