2011-06-03 76 views
16
string aux; 
int maxy,auxx=0; 

cin>>aux; 

maxy= (int)sqrt(aux.size()); 

我在歌廳:C++編譯器錯誤:不明確調用重載函數

1> error C2668: 'sqrt' : ambiguous call to overloaded function 
1>  could be 'long double sqrt(long double)' 
1>  or  'float sqrt(float)' 
1>  or  'double sqrt(double)' 

爲什麼?

回答

31

string::size()返回size_tsqrt不接受它的任何版本。所以編譯器必須投射,而不能選擇什麼 - 所有這些都是好的。你必須把明確的轉換:

maxy = (int)sqrt((double)aux.size()); 
11

的問題是,在C++中,有一個名爲sqrt三個功能 - 一個了結在float,一個採取double,和一個採取long double。當您嘗試呼叫時

sqrt(aux.size()); 

編譯器試圖確定您要調用哪些函數。由於aux.size()返回的string::size_type既不是float,double也不是long double,因此它會嘗試查看string::size_type是否可以隱式轉換爲這三者中的任何一個。但由於string::size_type可以轉換爲這三個類型,編譯器,標誌着該呼叫爲模糊的,因爲它是不清楚你想要做其轉換。

要解決此問題,您可以明確地將aux.size()轉換爲所需的類型。例如:

sqrt(double(aux.size())); 

sqrt(float(aux.size())); 

這使得呼叫明確地匹配的兩個功能中的一個。根據您想要的精度,您可以選擇三種過載中的任何一種。既然你只是回覆到int,那麼在這裏投入float可能就不錯了。

+1

「一個無與倫比的左括號創建一個尚未解決的緊張,所有的日子會陪着你」 http://xkcd.com/859/這就是爲什麼我喜歡C-風格轉換的像這樣的案例 - 他們生產的嵌套層次少。 – AnT 2011-06-03 22:13:53

+0

:-)謝謝!固定。 – templatetypedef 2011-06-03 22:14:21

0

試試您鑄造aux.size()來爲這些類型之一,所以不會產生歧義......

1

aux.size()返回std::size_t,但sqrt()沒有一個重載的版本,需要一個std::size_t參數。

編譯器報告sqrt有3個過載:其中參數爲float,doublelong doublestd::size_t可以轉換到任何這些,所以有,因爲編譯器的不確定性不知道是否std::size_t轉換爲floatdoublelong double

相關問題