这是我的代码。我正在使用Dev-C ++ 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;
}
我收到有关重载的各种错误消息。有人可以帮我弄清楚为什么它没有正确编译。
答案 0 :(得分:9)
正如预测的那样,由于您使用了std::sqrt
,错误是sqrt
和using namespace std;
之间发生符号冲突的结果。
标题cmath
有一个名为std::sqrt
的函数,由于sqrt
,符号名称using namespace std;
正在导入您的命名空间。即使您未包含math.h
,由于某种原因,您的编译器也会导入该标头,math.h
定义了sqrt
函数。
编译器抱怨说它不知道要使用哪个sqrt
。
正确的解决方案是不使用 using namespace std;
。另见:Why is "using namespace std" considered bad practice?。
在您的特定情况下,您可以使用以下内容替换using namespace std;
:
using std::cout;
using std::cin;
using std::endl;
避免在这些前面输入std::
。
说实话,编译器不应该包括math.h
,正如其他人所指出的那样,使用10年以上的编译器是愚蠢的。使用现代编译器。
编辑另外,请不要再连续发布六条评论来传达多行错误消息。只需编辑您的原始帖子。
答案 1 :(得分:0)
这在gcc中编译得很好。
尽管有些事情你可以改进,例如不包括,包括#include <stdlib.h>
stdlib
而不是stdlib.h
和making is_prime
bool
重载'sqrt(int&amp;)'的第22行调用是不明确的
尝试 sqrt<int>(n)
或sqrt((int) n)
::sqrt(n)
或std::sqrt(n)
或包含math.h
代替cmath
。最好的仍然是他的建议:不要使用using namespace std;
。
我的建议:切换到更主流的编译器,如gcc,clang或Visual Studio。它们更符合标准。
我正在使用的书使用Dev-C ++
我不想吝啬但转到另一本书。我不相信一本让你加入stdlib.h
的书。这是C尚未标准化的标题。所以...是的......转换书......