Вот мой код. Я использую 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 получает различные сообщения об ошибках перегрузки. Может кто-то, пожалуйста, помогите мне понять, почему он не компилируется правильно.
Как и было предсказано, ошибка является результатом столкновения символа между 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+ года просто глупо. Используйте современный компилятор.
Изменить: Кроме того, пожалуйста, никогда больше не отправляйте полдюжины комментариев подряд, чтобы передать сообщение с несколькими линиями. Просто отредактируйте исходный пост.
::sqrt(n)
, std::sqrt(n)
или sqrt<>(n)
.
sqrt
, что полностью исключило бы необходимость в cmath
. пример
Это компилируется в 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 еще не был стандартизирован. Итак... да... переключите книгу...
<stdlib.h>
не является улучшением, пока сохраняется вызов system
.
system
вызов
<stdlib.h>
должен быть либо<cstdlib>
, либо вы должны<cstdlib>
скобки, которые включают в себяextern "C"