2012-12-14 88 views
1

可能重複:
C++ compiler error: ambiguous call to overloaded function歧義平方根

只是複製一些代碼從PDF到兩個C++助洗劑XE2和Visual Studio表達2012二者都編譯器給錯誤代碼關於ambiquity。我剛剛開始,所以我不知道該怎麼做。也許我的教科書(pdf)現在已經陳舊過時了?它被稱爲「在14天內學習C++」。無論如何,這裏是複製的代碼。

#include <iostream.h> 
#include <conio.h> 
#include <math.h> 
#include <stdio.h> 
#pragma hdrstop 
void getSqrRoot(char* buff, int x); 
int main(int argc, char** argv) 
{ 
int x; 
char buff[30]; 
cout << 「Enter a number: 「; 
cin >> x; 
getSqrRoot(buff, x); 
cout << buff; 
getch(); 
} 
void getSqrRoot(char* buff, int x) 
{ 
sprintf(buff, 「The sqaure root is: %f」, sqrt(x)); 
} 

的錯誤代碼我在C++得到助洗劑是:

[BCC32錯誤] SquareRoot.cpp(19):中C的std :: SQRT(浮點)」之間E2015歧義:\程序文件(x86)\ embarcadero \ rad studio \ 9.0 \ include \ windows \ crtl \ math.h:266'和'std :: sqrt(long double)在c:\ program files(x86)\ embarcadero \ rad studio \ 9.0 \包括\ WINDOWS \ CRTL \文件math.h:302' 全解析方面 SquareRoot.cpp(18):解析:無效getSqrRoot(字符*,INT)

在一個側面說明,在我的PDF手冊引號是不同的人物正常「,我輸入。這些「也與編譯器不兼容。也許任何人都知道這個問題的解決方案?提前致謝。

+0

有沒有修復你應該使用「...」,而不是你的pdf中的任何其他。你可以將你的int轉換爲double:'sqrt(static_cast (x))' – Borgleader

+0

我只是讓'getSqrRoot'爲'double'。 – chris

+3

在X時期*書中避免任何* C++,除非這段時間是「兩生」。這裏有一個好書的列表:http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list –

回答

1

更改代碼這樣的:

void getSqrRoot(char* buff, int x) 
{ 
sprintf(buff, 「The sqaure root is: %f」, sqrt((float)x)); 
} 

因爲平方根重載函數編譯器有沒有從int x值的機會,隱式轉換爲float或double值,則需要直接做到這一點。

Compiler: see sqrt(int) -> what to choose? sqrt(float)/sqrt(double) ? 
Compiler: see sqrt((float)int) -> sqrt(float), ok! 
Compeler: see sqrt((double)int) -> sqrt(double), ok! 
+0

感謝您的回答,這個編譯器解釋文本真的很有幫助。 –

0

您getSqrRoot功能更改爲以下

void getSqrRoot(char* buff, float x) 
{ 

而且同樣固定在第一行的聲明。

發生這種情況,因爲std::sqrt這是您正在使用,以獲得平方根函數,可以採取無論是floatdouble但你必須給它一個int這導致了混亂,因爲編譯器現在不知道哪些函數來調用。