неоднозначный призыв к перегрузке — кастинг

Работа над программой, и есть одна строка моего кода, которая вызывает у меня проблемы. Мне было интересно, если кто-нибудь здесь может знать, как исправить эту одну строку кода:

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)

С помощью метода, предложенного Лучианом, появляется следующая ошибка:

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)

2

Решение

Используйте либо:

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

или же

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

Другие решения

Есть перегруженные версии pow за float а также double, Так как вы проходите в longs, вам нужно привести к float или же double, но компилятор не знает, какой вы хотите.

Попробуйте изменить 2 в 2.0, Это делает это double и должен устранить двусмысленность.

2

Я считаю, что ошибка в том, что 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

0