2012-02-24 287 views
3

我得到了我的代碼中的錯誤在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; 
} 
+0

你的'sqrt()'函數是什麼?你超載了嗎?編譯器展示了哪些候選人? – amit 2012-02-24 23:19:46

+1

'int j,num = 0;如果(num <= 1) { return false; }'這會不會導致'isPrime'每次都返回false? – chris 2012-02-24 23:25:28

+1

@chris:確實。一旦這個問題得到解決,下面的循環將返回除2之外的任何數字的錯誤。 – 2012-02-25 00:40:51

回答

-1

您需要編寫一個合理的sqrt函數。 Newton's method可能是最簡單的方法。另外,請勿在循環中每次調用sqrt函數。只需調用一次即可。

+5

顯然已經有多個'sqrt'函數可用。爲什麼這個人需要寫另一個? – 2012-02-24 23:35:00

+0

他們沒有一個完全符合他的要求。我想,他可以把圓釘塞在方孔裏。但是我們正在談論五六行代碼來做正確的事情。 – 2012-02-24 23:40:53

+2

@DavidSchwartz:他們所做的都是他想要的;他們只是沒有超載,因爲他的確切類型。他可以寫出五六行代碼,再加上幾十行代碼來測試它,並且希望他能夠完成所有的工作。但是我們正在談論一個對圖書館功能的調用來做正確的事情。 – 2012-02-25 00:29:46

9

嘗試:

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

正在發生的事情是,<cmath>包含3個不同的definitions of sqrt和編譯器不知道你要使用哪一個。

+1

另外,它應該是'std :: sqrt',可能是'static_cast (num)'。 – 2012-02-24 23:42:54

+0

過去在發佈的代碼OP中有一個「using namespace std」。我會採取static_cast的評論:D – mfontanini 2012-02-25 01:00:52

0

第二個函數後,您錯過了代碼中的一個角括號 您是否正在使用-lm標記編譯它?

加上你需要將類型轉換爲int。

相關問題