当出现“多个重载函数'sqrt'与参数列表匹配”时,我该怎么办?

4

在我的for循环中,for ( j = 3; j <=sqrt(num); j +=2),我遇到了一个错误:

超过一个重载函数"sqrt"与参数列表相匹配。

我该如何解决这个问题?

# include <cmath>

// determine if number is prime
bool isPrime (long n) 
{
  int j, num = 0;
  {
    if (num <=1)
      return false;
  }
  for ( j = 3; j <=sqrt(num); j +=2)
  {
    if (num % j == 0)
      return false;
  }   
  return true;
}

你们的 sqrt() 函数是什么?你们重载了它吗?编译器给出了哪些候选项? - amit
1
int j, num = 0; { if (num <=1)return false; } 这不会导致 isPrime 每次都返回 false 吗? - chris
1
@chris:确实。一旦修复了这个问题,以下循环将对除2以外的任何数字返回false。 - Mike Seymour
@Mike Seymour,干得好。这个会在以后节省不少麻烦。 - chris
3个回答

10

尝试:

for (j = 3; j <= std::sqrt(static_cast<float>(num)); j +=2)

发生的情况是,<cmath> 包含三个不同的sqrt定义,编译器不知道你试图使用哪一个。


1
另外,应该使用std::sqrtstatic_cast<float>(num) - Kerrek SB
代码中曾经有一个"using namespace std"。我会采用static_cast备注:D - mfontanini

0

你的代码在第二个函数后面缺少了一个尖括号。 你是否使用了-lm标签进行编译?

此外,你需要将j强制转换为int类型。


-1
你需要编写一个合理的 sqrt 函数。牛顿迭代法 可能是最简单的方法。此外,在循环中不要每次调用 sqrt 函数,只需调用一次即可。

6
已经有多个可用的 sqrt 函数,为什么这个人还需要写另一个函数? - Rob Kennedy
没有一个完全符合他的要求。我想他可以把圆形钉子塞进方形洞里,但是这需要写五到六行代码才能做到正确。 - David Schwartz
2
@DavidSchwartz:它们都完全符合他的要求;只是它们没有针对他所拥有的确切类型进行过载。我想他可以写五六行代码,再加上几十行来测试它,希望他做得没错。但我们只需要调用一个库函数就能做到正确。 - Mike Seymour
浮点数平方根函数是否正好符合他的要求? - David Schwartz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接