Работа над программой, и есть одна строка моего кода, которая вызывает у меня проблемы. Мне было интересно, если кто-нибудь здесь может знать, как исправить эту одну строку кода:
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)
Используйте либо:
long long range = ::pow (2, 60*(::pow(2,x)-1)) ;
или же
long long range = std::pow (2, 60*(std::pow(2,x)-1)) ;
Есть перегруженные версии pow
за float
а также double
, Так как вы проходите в long
s, вам нужно привести к float
или же double
, но компилятор не знает, какой вы хотите.
Попробуйте изменить 2
в 2.0
, Это делает это double
и должен устранить двусмысленность.
Я считаю, что ошибка в том, что 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