C++ 程序未能编译
这是我的密码。我使用的是Dev-C++4.9.8.0,我不明白为什么它不能编译C++ 程序未能编译,c++,C++,这是我的密码。我使用的是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 =
#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;
}
#包括
#包括
#包括
使用名称空间std;
int main(){
int n;//要测试素数的数字
int i;//循环计数器
int是_prime=true;//布尔标志。。。
//现在假设是真的。
//从键盘上获取一个数字。
cout>n;
//通过检查整除性来测试素数
//从2到sqrt(n)的所有整数。
i=2;
而(i这在gcc中编译得很好
虽然有些事情你可以改进,比如不包括#include
包括stdlib
而不是stdlib.h
和making is_prime
bool
第22行重载“sqrt(int&)”的调用不明确
尝试sqrt(n)
或sqrt((int)n)
@Andrey给出了答案:使用::sqrt(n)
或std::sqrt(n)
或包含math.h
而不是cmath
。最好的方法仍然是按照他的建议:不要使用使用命名空间std;
我的建议是:切换到更主流的编译器,比如gcc、clang或visualstudio。它们更好地符合标准
我正在使用的这本书使用了Dev-C++
我不想太刻薄,但换到另一本书上。我不相信一本书会让你包括stdlib.h
。这是C还没有标准化的时候的一个标题。所以…是的…换一本书…正如预测的那样,这个错误是由于std::sqrt
和sqrt
之间的符号冲突造成的,原因是你r使用命名空间std;
使用
头cmath
有一个名为std::sqrt
的函数,符号名sqrt
正在导入到您的命名空间中,因为您的使用了命名空间std;
。即使您没有包含math.h
,但出于某种原因,编译器也正在导入该头,并且math
定义sqrt
函数
编译器抱怨它不知道使用哪个sqrt
正确的解决方案是不要使用名称空间std;
。另请参阅:
在您的特定情况下,可以使用命名空间std;
将替换为以下内容:
using std::cout;
using std::cin;
using std::endl;
为了避免总是在这些文件前面键入std::
老实说,编译器不应该包括math.h
,正如其他人所指出的,使用一个10年以上的编译器是愚蠢的。使用一个现代的编译器
编辑:此外,请不要再连续发表半打评论来传达多行错误消息。只需编辑您的原始帖子。尝试发布您看到的错误消息。首先,
应该是
,或者您应该在外部“C”中包含括号
另一方面,使用名称空间std;
通常是一个糟糕的想法,可能会导致您描述的类型错误,因为它与std::
中常用的符号名冲突。@Ashishint is_prime=true;
是绝对合法的。Dev-C++4.9.8.0已有10年历史。请更新您的编译器。省略
的包含不是一个改进,而对系统的调用仍然存在。哦,是的,很抱歉没有看到系统
call@remyabel:实际上它是在C++11中。我知道,但我也知道符合标准的编译器不会给出这种错误。这就是为什么我说“尝试”@bolov提问者的评论表明,这不是模板,而是由于使用名称空间std
造成的过载问题,但如果您想使用名称空间std,您可以尝试::sqrt(n)
,std::sqrt(n)
或sqrt(n)
。另一种选择是根本不使用sqrt
,这将完全消除cmath
的需要。如果我能给你另一个+1作为关于发布错误的注释,我会的!