Visual Studio 2008 编译器不会自动转换为 C++ 中的 sqrt 的 double 吗?

StackOverflow https://stackoverflow.com/questions/2452510

  •  20-09-2019
  •  | 
  •  

编译器不应该在下面自动转换为 double 吗?至少沃尔特·萨维奇是这么说的。

#include <iostream>
#include <cmath>
using namespace std;

int main(){
    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << sqrt(k) << endl;
    return 0;
}//error C2668: 'sqrt' : ambiguous call to overloaded function
//Visual Studio 2008 on Win Vista
有帮助吗?

解决方案

的问题是,有三个版本sqrt可供选择:

     double sqrt (      double x );
      float sqrt (       float x );
long double sqrt ( long double x );

既然你传递一个int,编译器会促进你的说法,但它同样有效促进上述任何类型的整数,所以它是不明确的。

可以通过简单地明确地铸造上述类型中的一种,如在解决这个

cout << "The square root of k is: " << sqrt((double)k) << endl;

其他提示

暧昧呼叫错误是,它不知道其功能是不调用它不是隐式转换。

看看下面。如果我创造我自己的函数,需要一个双并返回一个double它有没有问题隐含转换。由于您的整数可以转换成任何的三个重载它不知道叫什么。

double mysqrt(double d)
{
   return d;
}
using namespace std;
int main(int argc, char ** argv)
{

    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << mysqrt(k) << endl;
    return 0;
}//Works Fine

然而,如果我添加mysqrt的另一个版本,需要一个浮子创建一个不明确的呼叫错误。

double mysqrt(float f)
{
    return f;
}
double mysqrt(double d)
{
    return d;
}
using namespace std;
int main(int argc, char ** argv)
{

    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << mysqrt(k) << endl;
    return 0;
}//error C2668: 'mysqrt' : ambiguous call to overloaded function

由于有多个 SQRT功能(过载)和超过1可以接受一个int参数没有松动的精度是由你来指定(这是一件好事,因为你不想让编译器以你根据一些间接证据表明决策 - 通过将int开方)。

Ç总是返回双版本除非sqrtf被调用。

试着用铸造你的电话(双)

从MSDN: [

double sqrt(
   double x 
);
float sqrt(
   float x 
);  // C++ only
long double sqrt(
   long double x
);  // C++ only
float sqrtf(
   float x 
);

] 1

有几个重载到std :: SQRT在CMATH。一个需要一个浮子和其他需要加倍。该编译器不知道要被调用,整数可以铸造成任何人。

在不存在附加的过载,这将自动转换为加倍[这是在C语言的情况下]正如所预期。

是的,它应该自动从 int 转换为 double。g++ 编译得很好,所以我猜 VS 是错误的

编辑:不知道为什么莫的回答被否决了。但我认为在c++中的函数重载期间,自动转换应该始终发生在自动转换中可能的最高数据类型上。例如:如果有一个选项可以从 int 转换为 long、float 和 double,则它应该始终执行 int 到 double 的转换。

我在 g++ 中尝试过,它正在调用 sqrt(double) 函数。

#include <iostream>
#include <cmath>
#include <typeinfo>
using namespace std;

int main(){
    int k;
    for(k = 1; k <= 10; k++)
        cout << "The square root of k is: " << sqrt(k) <<' '<<  typeid(sqrt(k)).name()<< endl;
    return 0;
}

所以 typeid() 的输出是“d”,这意味着它已经完成了从 int 到 double 的自动转换。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top