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

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

Восстановить пароль Регистрация
 
freshness
0 / 0 / 0
Регистрация: 19.09.2012
Сообщений: 30
16.11.2012, 22:01     Ошибка "неоднозначный вызов перегруженной функции" #1
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;
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Starscream
 Аватар для Starscream
55 / 43 / 2
Регистрация: 04.11.2012
Сообщений: 106
16.11.2012, 22:27     Ошибка "неоднозначный вызов перегруженной функции" #2
где pow(10,b-1)...
10.0 запиши
freshness
0 / 0 / 0
Регистрация: 19.09.2012
Сообщений: 30
16.11.2012, 22:30  [ТС]     Ошибка "неоднозначный вызов перегруженной функции" #3
Пробовал и 10.0f тоже пробовал чет не катит
prosto_lynx
 Аватар для prosto_lynx
49 / 24 / 1
Регистрация: 09.06.2008
Сообщений: 225
16.11.2012, 22:53     Ошибка "неоднозначный вызов перегруженной функции" #4
pow(10,b-1)%10 = 0 при любом b! Т.е. деление на ноль))

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

Добавлено через 19 минут
Извиняюсь... я, кажется, поторопился с выводами..))
Снусмумрик
 Аватар для Снусмумрик
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, иначе будет попытка взять остаток от деления дробного числа.
freshness
0 / 0 / 0
Регистрация: 19.09.2012
Сообщений: 30
16.11.2012, 23:56  [ТС]     Ошибка "неоднозначный вызов перегруженной функции" #6
Снусмумрик, Спасибо заработало, обьясните пожалуйста в чем смысл.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
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;
тип можешь выбрать любой(среди разрешенных конечно)
Снусмумрик
 Аватар для Снусмумрик
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 - указывает.
Примерно так)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
17.11.2012, 00:50     Ошибка "неоднозначный вызов перегруженной функции" #9
Цитата Сообщение от Снусмумрик Посмотреть сообщение
Для них double и long double - один и тот же тип.
с какого перепугу? 64 бита и 80?
ты лучше скажи 10.0 это float? double? или long double?
вот и компилятор не знает
а к чему приводить 10?
явное приведение снимает все вопросы

Добавлено через 1 минуту
Цитата Сообщение от Снусмумрик Посмотреть сообщение
По крайней мере g++ не ругается.
а ты не думаешь что там стоит реализация для int ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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 написано тоже самое.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
17.11.2012, 01:07     Ошибка "неоднозначный вызов перегруженной функции" #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Откуда взялось 64 и 80?
размер дубли и длинной дубли
8 байт и 10 байт
или конкретно откуда я взял? из литературы описания переменных
завтра замерю на VS2008
Цитата Сообщение от ForEveR Посмотреть сообщение
n3337 2.14.4/1
не знал,не приходилось сталкиваться спасибо
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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 ==========

А так, зависит от оси и реализации определенно.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
17.11.2012, 01:21     Ошибка "неоднозначный вызов перегруженной функции" #13
Цитата Сообщение от ForEveR Посмотреть сообщение
Не заметил что VS.
что у ТС я не знаю это у меня VS (еще CodeVisionAVR и Keil ну в микропроцессорах про плавающие вообще можно забыть)
недолюбливаю я плавающие(еще со времен ДОСа) и посему в них плаваю(ниче так каламбурчик)
слушай но если
Цитата Сообщение от ForEveR Посмотреть сообщение
10.0 это double без вариантов.
чавой тогда функцию не распознает?
опять происки Мелкомягких?
Снусмумрик
 Аватар для Снусмумрик
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.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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 ==========

Версий ниже не имею.)
Снусмумрик
 Аватар для Снусмумрик
67 / 3 / 1
Регистрация: 15.11.2012
Сообщений: 20
17.11.2012, 01:28     Ошибка "неоднозначный вызов перегруженной функции" #16
Цитата Сообщение от ForEveR Посмотреть сообщение
Версий ниже не имею.)
Так вроде только в 5,6 и 7 версии. Потом одумались)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,064
17.11.2012, 01:39     Ошибка "неоднозначный вызов перегруженной функции" #17
Цитата Сообщение от Снусмумрик Посмотреть сообщение
таблицы: long double same as double
не знал спасибо

Добавлено через 4 минуты
Цитата Сообщение от Снусмумрик Посмотреть сообщение
Не думаю, потому что вызывал ее и с 10, и с 10.0.
откуда увереность что её
стоит такая заглушка( допустим)
C++
1
2
3
4
 double pow(int m, int n)
  {
    return  pow((double) m, int n);
}
и все проблемы снимаются
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
17.11.2012, 01:43     Ошибка "неоднозначный вызов перегруженной функции" #18
ValeryS, gcc все-таки следует стандарту. Такие заглушки - нестандартное расширение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2012, 01:59     Ошибка "неоднозначный вызов перегруженной функции"
Еще ссылки по теме:

C++ Неоднозначный вызов перегруженной функции (sqrt)
C++ Неоднозначный вызов перегруженной функции
C++ Pow: неоднозначный вызов перегруженной функции

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
17.11.2012, 01:59     Ошибка "неоднозначный вызов перегруженной функции" #19
Шо вы спорите?
Студия она и есть студия
Yandex
Объявления
17.11.2012, 01:59     Ошибка "неоднозначный вызов перегруженной функции"
Ответ Создать тему
Опции темы

Текущее время: 08:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru