C++ 对重载转换的不明确调用

C++ 对重载转换的不明确调用,c++,casting,compiler-errors,long-integer,code-cleanup,C++,Casting,Compiler Errors,Long Integer,Code Cleanup,在一个程序上工作,我的代码中有一行给了我问题。我想知道这里是否有人知道如何修复这一行代码: long long x; srand(time(NULL)); x = rand() % 1000; long long range = pow (2, 60*(pow(2,x)-1)) ; 每当我运行这个程序时,我都会收到一个错误,指出有一个对重载的模糊调用。 我做了一些研究,似乎与不同的类型有关(关于long)。我在想,也许有一种方法可以用不同的方式来处理这个问题,但是我不确定怎么做。 为了让第二行

在一个程序上工作,我的代码中有一行给了我问题。我想知道这里是否有人知道如何修复这一行代码:

long long x;
srand(time(NULL));
x = rand() % 1000;
long long range = pow (2, 60*(pow(2,x)-1)) ;
每当我运行这个程序时,我都会收到一个错误,指出有一个对重载的模糊调用。 我做了一些研究,似乎与不同的类型有关(关于
long
)。我在想,也许有一种方法可以用不同的方式来处理这个问题,但是我不确定怎么做。 为了让第二行代码正常工作,会有人对该怎么做有什么建议吗

编辑:我得到以下错误:

main1.cpp:149: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
/usr/include/architecture/i386/math.h:343: note: candidate 1: double pow(double, double)
/usr/include/c++/4.2.1/cmath:357: note: candidate 2: float std::pow(float, float)
main1.cpp:149: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
/usr/include/architecture/i386/math.h:343: note: candidate 1: double pow(double, double)
/usr/include/c++/4.2.1/cmath:357: note: candidate 2: float std::pow(float, float)
根据Luchian建议的方法,出现以下错误:

main1.cpp:149: error: call of overloaded 'pow(int, long long int&)' is ambiguous
/usr/include/architecture/i386/math.h:343: note: candidates are: double pow(double, double)
/usr/include/c++/4.2.1/cmath:357: note:                 float std::pow(float, float)
/usr/include/c++/4.2.1/cmath:361: note:                 long double std::pow(long double, long double)
/usr/include/c++/4.2.1/cmath:365: note:                 double std::pow(double, int)
/usr/include/c++/4.2.1/cmath:369: note:                 float std::pow(float, int)
/usr/include/c++/4.2.1/cmath:373: note:                 long double std::pow(long double, int)

我认为错误在于
pow
要求第一个参数不是
int

候选职能应为:

(1)float pow( float base, float exp );

(2)double pow( double base, double exp );

(3)long double pow( long double base, long double exp );
你需要:

long long range = pow(2.0, 60*(pow(2.0, x)-1));
因此,编译器可以知道如何使用
double
版本的
pow

使用以下任一方法:

long long range = ::pow (2, 60*(::pow(2,x)-1)) ;


对于
float
double
,有重载版本的
pow
。由于传递的是
long
s,因此需要强制转换为
float
double
,但编译器不知道需要哪一个


尝试将
2
更改为
2.0
。这将使它成为一个
,应该可以解决歧义。

有什么错误?每当我运行此程序时,我都会收到“错误:调用重载的'pow(int,long-long-int&')是不明确的”编辑您的问题,以包含完整的错误消息-包括候选项。请参阅-错误消息可以让您走很长的路。下一次,发布它。@LuchianGrigore我刚刚添加了我目前从Drise的铸造版本中得到的东西。我现在正在仔细检查,一秒钟。我想,为了在我的情况下实现这一点,我需要静态铸造它,而不是使用C铸造风格。我尝试了你的方法,但最终还是失败了。生成的错误语句我刚刚添加到我的消息中。我认为歧义来自于
pow
的两个定义-一个来自
std
,一个来自全局名称空间。@Drise:可能最好转换为
双精度
,而不是
float
,由于
2.0
是一个
double
。我尝试了两种方法,但得到的错误消息略有改变。用错误语句更新原始帖子,以便查看。@Julian现在您可以转换为
long double
.Hmm。。有点困惑。我正在尝试你的第二个版本的代码,我是否需要在范围声明期间强制转换这个?因此:“long long-range=static_caststd::pow(2,60*(std::pow(2,x)-1));”此外,我还添加了x的值,没想到它会那么重要,但在做了更多的实验后,我认为在原始帖子中显示它也会很有帮助。而且,每当我尝试使用您的第一个方法时,我都能够成功编译,然而,我收到的数字是完全错误的(巨大的负数)。我已经在使用long-long,所以我不确定我的代码前面的某个地方是否有一个小错误,或者它是否与代码的这一部分中当前发生的其他事情有关。但是在做一些测试时,我注意到错误发生在第一个pow内的第二个pow内。无论何时更改为std::pow,都是发生不明确错误的时候,所以我很好奇为什么
long long range = std::pow (2, 60*(std::pow(2,x)-1)) ;