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

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

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

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

16.11.2012, 22:01. Просмотров 1136. Ответов 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;
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2012, 22:01     Ошибка "неоднозначный вызов перегруженной функции"
Посмотрите здесь:
C++ Ошибка "sin: неоднозначный вызов перегруженной функции"
C++ Ошибка при преобразовании числа в строку: "неоднозначный вызов перегруженной функции"
C++ Ошибка: неоднозначный вызов перегруженной функции
Ошибка sin: неоднозначный вызов перегруженной функции C++
Ошибка C2668: sqrt: неоднозначный вызов перегруженной функции C++
C++ Ошибка C2668: mult: неоднозначный вызов перегруженной функции
C++ Ошибка: error C2668: abs: неоднозначный вызов перегруженной функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
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 минут
Извиняюсь... я, кажется, поторопился с выводами..))
Снусмумрик
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
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,640
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
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,640
17.11.2012, 00:50     Ошибка "неоднозначный вызов перегруженной функции" #9
Цитата Сообщение от Снусмумрик Посмотреть сообщение
Для них double и long double - один и тот же тип.
с какого перепугу? 64 бита и 80?
ты лучше скажи 10.0 это float? double? или long double?
вот и компилятор не знает
а к чему приводить 10?
явное приведение снимает все вопросы

Добавлено через 1 минуту
Цитата Сообщение от Снусмумрик Посмотреть сообщение
По крайней мере g++ не ругается.
а ты не думаешь что там стоит реализация для int ?
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,640
17.11.2012, 01:07     Ошибка "неоднозначный вызов перегруженной функции" #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Откуда взялось 64 и 80?
размер дубли и длинной дубли
8 байт и 10 байт
или конкретно откуда я взял? из литературы описания переменных
завтра замерю на VS2008
Цитата Сообщение от ForEveR Посмотреть сообщение
n3337 2.14.4/1
не знал,не приходилось сталкиваться спасибо
ForEveR
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,640
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
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
Модератор
6537 / 5003 / 460
Регистрация: 14.02.2011
Сообщений: 16,640
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
В астрале
Эксперт С++
7968 / 4730 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
17.11.2012, 01:43     Ошибка "неоднозначный вызов перегруженной функции" #18
ValeryS, gcc все-таки следует стандарту. Такие заглушки - нестандартное расширение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2012, 01:59     Ошибка "неоднозначный вызов перегруженной функции"
Еще ссылки по теме:
C++ Ошибка: error C2668: abs: неоднозначный вызов перегруженной функции - C++
C++ Ошибка 2, error C2668: pow: неоднозначный вызов перегруженной функции
C++ Неоднозначный вызов перегруженной функции
C++ Неоднозначный вызов перегруженной функции
C++ неоднозначный вызов перегруженной функции pow

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 1
17.11.2012, 01:59     Ошибка "неоднозначный вызов перегруженной функции" #19
Шо вы спорите?
Студия она и есть студия
Yandex
Объявления
17.11.2012, 01:59     Ошибка "неоднозначный вызов перегруженной функции"
Ответ Создать тему
Опции темы

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