Visual Studio不让我使用sqrt或floor,重载函数的调用不明确。

6
我需要进行一个调用。
long long a = sqrt(n/2);

我的代码中使用了 long long,但是编译器提示我使用 sqrt() 函数时出现二义性。我不明白这里有什么可能会引起二义性的地方。同样的问题也出现在了 floor() 函数中。请问应该如何解决这个问题?

以下是我的 include:

#include "stdafx.h"
#include <iostream>
#include <cmath>
using namespace std;

1
尝试将 n/2 强制转换为 double - Mysticial
4个回答

8

有几个重载版本的sqrt()floor()函数,按照重载决议规则,对于调用sqrt(long long)函数没有“最佳匹配”。因此只需要将参数转换为适当的类型即可,例如:

long long a = sqrt(static_cast<double>(n/2));

6
//use 
sqrt(static_cast<double>(n/2));
//instead of 
sqrt(n/2);

1
@MaziarBouali,这是关于C++的问题。你所想到的C库是math.h - Konrad Rudolph
1
@MaziarBouali,C头文件是math.h。C++的头文件是cmath。显著的区别是其中一个是std命名空间的一部分。 - chris
@MaziarBouali 完全没有关联。除了这个引用已经过时且包含错误之外,“这段代码”明显是C ++。库所写的语言无关紧要。即使不是这样,C ++ 标准的 §26.8 包括了这个库。 - Konrad Rudolph
@KonradRudolph,哦,我以为没有任何东西,当我检查时。也许你是在我之后做的 :p - chris
1
请注意,如果您将(double)更改为static_cast<double>()形式并通知Konrad,我相信他会撤销他的反对票。在SO上的反对票(通常)不是人身攻击,大多数情况下都会为更好的答案铺平道路。 - Matthieu M.
显示剩余3条评论

3

sqrt函数需要一个floatdoublelong double类型的参数:

long long a = sqrt(n * 0.5);

long long 转换为 double 可能会失去一些 精度,但值非常接近。


我不明白为什么需要将它更改为double?这样做不会丢失精度/可能截断变量吗?我的n变量非常大。 - MyNameIsKhan
@AgainstASicilian 嗯,long long 简单来说就是没有版本。 - Konrad Rudolph
哦,我不知道。sqrt()和floor()适用于哪些数据类型?int和double? - MyNameIsKhan
@AgainstASicilian 这些函数有floatdoublelong double的重载版本。由于没有long long的版本,编译器必须将你的long long转换为其中一个其他类型。由于所有这些转换都同样好,编译器无法选择任何一个而使调用变得模糊不清。 - bames53

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接