2009-04-03 6 views
1

Итак, я понимаю, что требуется #include, и что существует pow (x, y), где x^y работает ... но когда я попытался использовать pow (2, (num-1)), он отбросил назад ошибка ...Как вы используете экспоненту в C++ с переменной?

errorC2668: «бух»: неоднозначный вызов перегруженной функции

строка кода у меня есть для него следующим образом

perfect = (pow(2,(num-1))) * (pow(2,num)-1); 

Любые рекомендации?

Заранее спасибо

EDIT:

Num действительно объявлен как междунар.

Num имеет значение, начинается с 1 и переходит в UINT_MAX

Добавлена ​​звездочкой уравнения

+0

Как ни странно, это работает как есть с g ++. Возможно, это расширение. – paxdiablo

+0

У меня есть друг, с которым я разговариваю, в настоящий момент кто использует g ++ и linux, отлично работает и для него ... да, да! Я знаю! Linux лучше, но я не могу играть так сильно, как в Linux, поэтому я застрял в окнах. – Jeff

ответ

8

Компилятор не знает, какую функцию pow() вызывать. Перегрузки перечисленные here дает следующий список:

 float pow (  float base,  float exponent); 
    double pow (  double base,  double exponent); 
long double pow (long double base, long double exponent); 
     float pow (  float base,   int exponent); 
    double pow (  double base,   int exponent); 
long double pow (long double base,   int exponent); 

Компилятор не угадать, какой из них использовать. Сделайте его явным с помощью бросков.

perfect = (pow(2.,(double)(num-1))) < (pow(2.,(double)num)-1); 

Возможно, там есть дополнительные броски, но они ничего не повредят.

+0

Я не думаю, что это число, так как это заставит его выбрать один из двух последних. Я думаю, что это 2, которые должны быть явно приведены к одному из типов данных в последних двух. – paxdiablo

+0

Преобразование из int в double ничего не повредит? – Jeff

+0

Да, вы можете уйти без литья. –

1

Добавить отсутствующее умножение (или то, что вы хотите), а также должны быть точка с запятой в конце line:

perfect = (pow(2,(num-1))) * (pow(2,num)-1) ; 
+0

полностью забыл нужную звездочку ... но имел точку с запятой в фактическом коде ... не помог, хотя – Jeff

2

Это разрешенные функции pow() в C++. Проблема в том, что ваш код имеет в качестве первого аргумента int, а C++ не знает, следует ли продвигать его в двойном или длинном двойном.

 double pow (  double base,  double exponent); 
long double pow (long double base, long double exponent); 
     float pow (  float base,  float exponent); 
    double pow (  double base,   int exponent); 
long double pow (long double base,   int exponent); 

Попробуйте положить в (double)2 вместо просто 2.

perfect = (pow((double)2,(num-1))) * (pow((double)2,num)-1) 
1

От error C2668: 'pow' : ambiguous call to overloaded function in VC++ 2005 only, alex.m написал,

"POW" (любая перегрузка) принимает плавающей точкой номер типа (одиночный, двойной или длинный двойной точности) в качестве первого аргумента , а не целое число. Это , откуда исходит ошибка, поскольку компилятор не может угадать, как вы хотите ваше длинное целое, которое нужно преобразовать.

Просто попробуйте написать выражение произнесения, так:

Код блока

с = пау ((двойной) numberOfScansCompleted, 2);

Итак, если вы попробуете pow((double)2,(num-1)), он должен работать.


Забавное примечание стороны, как я напечатал начало его в Google, «Pow неоднозначный вызов перегруженной функции» придумал, как верхний предложил поиск.

+0

или просто pow (2.0, ... – derobert

+0

да, это тоже работает –

0

Помните, что вы также можете написать целые степени 2 с оператором сдвига:

int perfect = (1<<(num-1)) * ((1<<num) - 1); 

Или с ldexp (также включено от <cmath>):

double perfect = ldexp(1.0, num-1) * (ldexp(1.0, num) - 1);