过度模糊的召唤 - 铸造

时间:2012-09-12 15:38:29

标签: 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)。我想可能有一种方法可以用不同的方式来解决这个问题,但是我不确定如何做到这一点。 有人会碰巧有什么建议可以让第二行代码工作吗?

编辑:我收到以下错误:

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)

3 个答案:

答案 0 :(得分:2)

powfloatdouble的重载版本。由于您传入long,因此需要转换为floatdouble,但编译器不知道您想要哪一个。

尝试将2更改为2.0。这使它成为double并且应该解决歧义。

答案 1 :(得分:1)

使用:

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

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

答案 2 :(得分:0)

我认为错误是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版本