Как вы используете показатель в C ++ с переменной? - PullRequest
1 голос
/ 03 апреля 2009

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

errorC2668: 'pow': неоднозначный вызов перегруженной функции

строка кода, которую я имею для этого, выглядит следующим образом

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

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

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

EDIT:

num действительно объявлено как int.

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

В уравнение добавлена ​​звездочка

Ответы [ 5 ]

8 голосов
/ 03 апреля 2009

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

      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);

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

2 голосов
/ 03 апреля 2009

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

     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 голос
/ 03 апреля 2009

С ошибка C2668: 'pow': неоднозначный вызов перегруженной функции только в VC ++ 2005 , alex.m пишет,

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

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

Кодовый блок

с = POW ((двойной) numberOfScansCompleted, 2);

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


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

1 голос
/ 03 апреля 2009

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

perfect = (pow(2,(num-1))) * (pow(2,num)-1) ;
0 голосов
/ 03 апреля 2009

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

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

Или с ldexp (также входит в <cmath>):

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