1

可能重复:
C++ 编译器错误:对重载函数的模糊调用

刚刚将一些代码从 pdf 复制到 C++builder XE2 和 Visual Studio Express 2012 中。两个编译器都给出了关于歧义的错误代码。我刚开始,所以我真的不知道该怎么做。也许我的教科书(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++builder 中得到的错误代码是:

[BCC32 错误] SquareRoot.cpp(19): E2015 Ambiguity between 'std::sqrt(float) at c:\program files (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\include\windows\crtl\math.h:302' 完整的解析器上下文 SquareRoot.cpp(18):解析: void getSqrRoot(char *,int)

附带说明一下,我的 pdf 手册中的引号与我键入的普通“”字符不同。这些“也与编译器不兼容。也许有人也知道这个问题的解决方法吗?提前谢谢。

4

2 回答 2

3

像这样更改您的代码:

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!
于 2012-12-14T07:50:30.820 回答
1

将您的 getSqrRoot 函数更改为以下

void getSqrRoot(char* buff, float x)
{

同样修复第一行中的声明。

发生这种情况是因为std::sqrt您使用哪个函数来获取平方根,可以采用 afloat或 adouble但您给了它 anint这会导致混淆,因为编译器现在不知道要调用哪个函数。

于 2012-12-14T07:02:25.220 回答