Что делать, если «списку аргументов соответствует несколько экземпляров перегруженной функции sqrt»?

Я получаю ошибку в моем коде в цикле 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;
}

person user1231810    schedule 24.02.2012    source источник
comment
Каковы ваши sqrt() функции? ты его перегрузил? Каких кандидатов показывает вам компилятор?   -  person amit    schedule 25.02.2012
comment
int j, num = 0; { if (num <=1) return false; } Разве это не приведет к тому, что isPrime будет каждый раз возвращать false?   -  person chris    schedule 25.02.2012
comment
@chris: Действительно. Как только это будет исправлено, следующий цикл вернет false для любого числа, кроме 2.   -  person Mike Seymour    schedule 25.02.2012
comment
@Майк Сеймур, хороший улов. Это избавит вас от головной боли позже.   -  person chris    schedule 25.02.2012


Ответы (3)


Пытаться:

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

Происходит то, что <cmath> содержит 3 разных определения sqrt и компилятора не знает, какой из них вы пытаетесь использовать.

person mfontanini    schedule 24.02.2012
comment
Кроме того, это должно быть std::sqrt и, возможно, static_cast<float>(num). - person Kerrek SB; 25.02.2012
comment
Раньше в опубликованном коде OP использовалось пространство имен std. Я приму замечание static_cast :D - person mfontanini; 25.02.2012

Вы пропустили угловую скобку в своем коде после второй функции. Вы компилируете ее с тегом -lm?

плюс вам нужно t typecast j как int.

person Community    schedule 24.02.2012

Вам нужно написать разумную функцию sqrt. метод Ньютона, пожалуй, самый простой способ. Кроме того, не вызывайте функцию sqrt каждый раз в цикле. Просто позвоните один раз.

person David Schwartz    schedule 24.02.2012
comment
Очевидно, уже доступно несколько sqrt функций. Зачем этому человеку писать еще один? - person Rob Kennedy; 25.02.2012
comment
Никто из них не делает то, что хочет. Я полагаю, он мог бы воткнуть круглый стержень в квадратное отверстие. Но мы говорим о пяти или шести строках кода, чтобы сделать это правильно. - person David Schwartz; 25.02.2012
comment
@DavidSchwartz: Все они делают именно то, что он хочет; они просто не перегружены для того типа, который у него есть. Он мог бы написать пять или шесть строк кода, плюс несколько десятков, чтобы проверить его, и надеяться, что у него все правильно, я полагаю. Но мы говорим об одном вызове библиотечной функции, чтобы сделать это правильно. - person Mike Seymour; 25.02.2012
comment
Функция квадратного корня с плавающей запятой делает именно то, что он хочет? - person David Schwartz; 25.02.2012