Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
freshness
0 / 0 / 0
Регистрация: 19.09.2012
Сообщений: 30
#1

Ошибка "неоднозначный вызов перегруженной функции" - C++

16.11.2012, 22:01. Просмотров 1196. Ответов 18
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include "math.h"
 
using namespace std;
 
int count(int a,int b)
{
    return  a/pow(10,b-1)%10;
}
 
 
int numcount(int x)
{
    int a=0;
    while (x>=1)
    {
        a++;
        x/=10;
    }
 
    return a;
}
 
 
int main()
{
    int a=0;
    cout<<"Enter N : ";
    cin>>a;
    int f=0;
    int g=0;
    int d=0;
    while(d != 1)
    {
    d=numcount(a);
    for (int i=1;i<=d;i++)
    {
        g=count(a,i);
            f+=g;
    }
    a=f;
    f=0;
    }
    cout<<"Koren : "<<a;
    system("pause");
    return 0;
}
Ошибка
error C2668: pow: неоднозначный вызов перегруженной функции
1> D:\Programm\VisualStudio\VC\include\math.h(575): может быть 'long double pow(long double,int)'
1> D:\Programm\VisualStudio\VC\include\math.h(527): или 'float pow(float,int)'
1> D:\Programm\VisualStudio\VC\include\math.h(489): или 'double pow(double,int)'
1> при попытке сопоставить список аргументов '(int, int)'
В строчке
Код
return  a/pow(10,b-1)%10;
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 22:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибка "неоднозначный вызов перегруженной функции" (C++):

Ошибка "sin: неоднозначный вызов перегруженной функции" - C++
Доброго времени суток! Объясните, пожалуйста, что означает ошибка &quot;sin: неоднозначный вызов перегруженной функции&quot;, уже не в первый раз...

Ошибка при преобразовании числа в строку: "неоднозначный вызов перегруженной функции" - C++
вот сокращенный код #include &lt;iostream&gt; #include &lt;string&gt; #define N 5 using namespace std; struct charact...

Ошибка: неоднозначный вызов перегруженной функции - C++
Ошибка:= error C2668: TCalc::TCalc: неоднозначный вызов перегруженной функции myclass\myclass.cpp MyClass TCalc.cpp #include...

Ошибка sin: неоднозначный вызов перегруженной функции - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;iomanip&gt; using namespace std; int main() { double f={0}; int i; ...

Ошибка C2668: mult: неоднозначный вызов перегруженной функции - C++
Помогите пожалуйста, не знаю как правильно избавиться от ошибки. Исчезает только если из объявления в параметрах (33 строчка) убрать...

Ошибка C2668: sqrt: неоднозначный вызов перегруженной функции - C++
Добрый вечер. Это опять я, чайник. Решаю такую задачу: &quot;Вывести на экран N-ое число из ряда Фибоначчи&quot;. Использую формулу Бине ...

18
Starscream
55 / 43 / 2
Регистрация: 04.11.2012
Сообщений: 106
16.11.2012, 22:27 #2
где pow(10,b-1)...
10.0 запиши
1
freshness
0 / 0 / 0
Регистрация: 19.09.2012
Сообщений: 30
16.11.2012, 22:30  [ТС] #3
Пробовал и 10.0f тоже пробовал чет не катит
0
prosto_lynx
49 / 24 / 1
Регистрация: 09.06.2008
Сообщений: 226
16.11.2012, 22:53 #4
pow(10,b-1)%10 = 0 при любом b! Т.е. деление на ноль))

Добавлено через 25 секунд
p.s. кроме b=1...

Добавлено через 19 минут
Извиняюсь... я, кажется, поторопился с выводами..))
1
Снусмумрик
67 / 3 / 1
Регистрация: 15.11.2012
Сообщений: 20
16.11.2012, 23:22 #5
Странно, у меня в gcc все нормально вызвалось. Попробуйте ввести дополнительную переменную. Что-то вроде этого:
C++
1
2
    double val = 10.0;
    return ( (int)(a/pow(val,b-1)))%10;
И еще не забудьте привести левую часть operator% к int, иначе будет попытка взять остаток от деления дробного числа.
0
freshness
0 / 0 / 0
Регистрация: 19.09.2012
Сообщений: 30
16.11.2012, 23:56  [ТС] #6
Снусмумрик, Спасибо заработало, обьясните пожалуйста в чем смысл.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
17.11.2012, 00:08 #7
Цитата Сообщение от freshness Посмотреть сообщение
Спасибо заработало, обьясните пожалуйста в чем смысл.
Он тебе писал что у pow несколько реализаций
C++
1
2
3
float pow(float,int);
long double pow(long double,int);
double pow(double,int);
и он не знает к чему твои 10 приводить, соответственно какую функцию вызывать
та же история и с 10.0
а когда ты явно объявил double все стало ясно
все это делается проще приведением типов
C++
1
return  a/pow((double)10,b-1)%10;
тип можешь выбрать любой(среди разрешенных конечно)
1
Снусмумрик
67 / 3 / 1
Регистрация: 15.11.2012
Сообщений: 20
17.11.2012, 00:17 #8
После того как компилятор нашел функции pow (их целых три) он должен выбрать одну, которая лучше всего подходит для вызова. Он составляет список кандидатов и делает следующие вещи (за строгую последовательность компилятора VC не ручаюсь):
1. Исключает недоступные функции (private и т.д.);
2. Исключает функции с не тем числом параметров;
3. Исключает функции, чьи параметры не могут быть преобразованы в аргументы вызова;
4. Исключает функции, для которых требуется сужающее преобразование;
5. Исключает функции, которые требует расширения аргументов(или большего расширения, чем другие функции).
После этого должна остаться только одна функция. Если их больше, то возникает ошибка. В Вашем случае возникает странная вещь, так как double, float и long double требуют разного расширения. По крайней мере g++ не ругается. Наверное, у Вас стоит VC 5, 6 или 7. Для них double и long double - один и тот же тип. Поэтому у него после выполнения всех пунктов остались две функции, и он не может выбрать, какую ему вызвать.

Попытка передать 10.0 тоже не работает, т.к. не указывает явно, какой это тип, а объявление double val - указывает.
Примерно так)
1
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
17.11.2012, 00:50 #9
Цитата Сообщение от Снусмумрик Посмотреть сообщение
Для них double и long double - один и тот же тип.
с какого перепугу? 64 бита и 80?
ты лучше скажи 10.0 это float? double? или long double?
вот и компилятор не знает
а к чему приводить 10?
явное приведение снимает все вопросы

Добавлено через 1 минуту
Цитата Сообщение от Снусмумрик Посмотреть сообщение
По крайней мере g++ не ругается.
а ты не думаешь что там стоит реализация для int ?
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.11.2012, 00:59 #10
ValeryS, Откуда взялось 64 и 80?
n3337 3.9.1/8
There are three floating point types: float, double, and long double. The type double provides at least
as much precision as float, and the type long double provides at least as much precision as double.
Литерал 10.0 это double без вариантов.

n3337 2.14.4/1

The type of a floating literal is double unless explicitly specified by a suffix.
Собственно в С++03 написано тоже самое.
2
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
17.11.2012, 01:07 #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Откуда взялось 64 и 80?
размер дубли и длинной дубли
8 байт и 10 байт
или конкретно откуда я взял? из литературы описания переменных
завтра замерю на VS2008
Цитата Сообщение от ForEveR Посмотреть сообщение
n3337 2.14.4/1
не знал,не приходилось сталкиваться спасибо
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.11.2012, 01:12 #12
ValeryS, Хм. Не заметил что VS. Ну да будет так. Хотя к примеру у меня в VS

C++
1
2
3
4
int main()
{
    static_assert(sizeof(double) == sizeof(long double), "double != long double");
}
========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========

А так, зависит от оси и реализации определенно.
0
ValeryS
Модератор
6651 / 5060 / 470
Регистрация: 14.02.2011
Сообщений: 16,919
17.11.2012, 01:21 #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Не заметил что VS.
что у ТС я не знаю это у меня VS (еще CodeVisionAVR и Keil ну в микропроцессорах про плавающие вообще можно забыть)
недолюбливаю я плавающие(еще со времен ДОСа) и посему в них плаваю(ниче так каламбурчик)
слушай но если
Цитата Сообщение от ForEveR Посмотреть сообщение
10.0 это double без вариантов.
чавой тогда функцию не распознает?
опять происки Мелкомягких?
0
Снусмумрик
67 / 3 / 1
Регистрация: 15.11.2012
Сообщений: 20
17.11.2012, 01:23 #14
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от ValeryS Посмотреть сообщение
с какого перепугу? 64 бита и 80?
: Я имею в виду реализацию типов данных в компиляторе VC++ Внизу таблицы: long double same as double
Понятно, что на уровне языка это разные типы.


Цитата Сообщение от ValeryS Посмотреть сообщение
а ты не думаешь что там стоит реализация для int ?
Не думаю, потому что вызывал ее и с 10, и с 10.0.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
17.11.2012, 01:26 #15
Хз. 2012 RC

C++
1
2
3
4
5
6
#include <cmath>
 
int main()
{
    pow(10.0, 5);
}
========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========

2010 Express

========== Построение: успешно: 1, с ошибками: 0, без изменений: 0, пропущено: 0 ==========

Версий ниже не имею.)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2012, 01:26
Привет! Вот еще темы с ответами:

Ошибка 2, error C2668: pow: неоднозначный вызов перегруженной функции - C++
Пытаюсь разобраться с функциями. И потому усложнил обычный пример. Вылезла ошибка: Ошибка 2, error C2668: pow: неоднозначный вызов...

Ошибка: error C2668: abs: неоднозначный вызов перегруженной функции - C++ - C++
Мне выкидывает ошибку при сборке. 1&gt; CCRakNetSlidingWindow.cpp 1&gt;..\Common\RakNet\CCRakNetSlidingWindow.cpp(221): error C2668: abs:...

Ошибка: error C2668: abs: неоднозначный вызов перегруженной функции - C++
Мне выкидывает ошибку при сборке. 1&gt; QueueTest.cpp 1&gt;c:\documents and settings\администратор\рабочий...

Ошибка в программе error C2668: std::to_string: неоднозначный вызов перегруженной функции - C++
FILE *f1; f1 = fopen(&quot;matrix.txt&quot;, &quot;w&quot;); for (unsigned int i = 0; i &lt; matrix.size(); i++) { vector&lt;double&gt; s =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
17.11.2012, 01:26
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru