Отсутствуют экземпляры перегруженная функция pow

Отсутствуют экземпляры перегруженная функция pow

У меня проблемы с запуском следующего кода. Я получил это: ошибка C2668: «Pow»: неоднозначный вызов перегруженной функции. Я пытался вручную привести аргументы к подходящему типу, используя static_cast, однако я думаю, что получаю некоторые ошибки указателя ?!

Программа должна преобразовать число из базы 16 в базу 10.

Как я могу это исправить? Спасибо.

Решение

strlen тип возврата size_t в C ++. Таким образом, вы можете устранить неоднозначность с помощью приведения:

и главное должно вернуться int вместо void :

Другие решения

Хотя вы пометили свой вопрос как вопрос на C, вы фактически скомпилировали свою программу как программу на C ++, потому что это C ++, которая позволяет перегружать функции.

В вашем случае компилятор C ++ не может выбрать подходящую перегруженную функцию pow. Сообщение об ошибке ясно показывает, какие функции учитывает компилятор. Чтобы убрать неоднозначность, вы можете вызвать функцию, например, следующим образом

В этом случае компилятор будет использовать функцию

Учтите, что в C / C ++ функция main должна иметь тип возвращаемого значения int ,

В C функция определяется как

в то время как в C ++ это обычно определяется как

И я думаю, что есть опечатка

Вместо строкового литерала «А» должен быть символьный литерал «А»

В С язык, который мы можем найти библиотечную функцию под math.h:

В C ++ язык мы можем иметь множество перегруженных функций под CMATH такие как:

Поскольку вы использовали программирование в стиле C, но скомпилировали его с помощью компилятора C ++, компилятор может столкнуться с состояниями неоднозначности с определенной функцией в математической библиотеке, поэтому вам следует соответствующим образом преобразовать аргумент в соответствии с определением функции 1 как упоминалось выше, поэтому измените свой код как,

ТАКЖЕ ОТМЕЧАЕТСЯ
с в данном фрагменте кода ошибка как Perreal отметил

Вы не можете выполнять арифметические операции со строковым литералом. измените его, как упоминал Птефан
,также изменить
int result в double result если вам нужна высокая точность и точные результаты.

C ++ 98 предоставляет следующие перегруженные версии pow :

Первый аргумент, который вы используете, 16 , может быть преобразован в любой из типов первых аргументов, используемых в этих функциях. Следовательно, компилятор не может разрешить неоднозначность. Вы можете устранить неоднозначность, явно указав первый аргумент, указав его тип. Любое из следующего должно работать:

Читайте также:  Зимбра почта вход алмазова

Если вы можете использовать C++11 Вы можете использовать свой существующий код. Это имеет перегрузку:

где Type1 а также Type2 являются арифметические типы .

Есть елементарная програма.

и на нее ругаеться вот такими матами
c:usershomedocumentsvisual studio 2010projectszadacha_2zadacha_2zadacha_2.cpp(12): error C2668: sqrt: неоднозначный вызов перегруженной функции
1> c:program files (x86)microsoft visual studio 10.0vcincludemath.h(589): может быть "long double sqrt(long double)"
1> c:program files (x86)microsoft visual studio 10.0vcincludemath.h(541): или "float sqrt(float)"
1> c:program files (x86)microsoft visual studio 10.0vcincludemath.h(127): или "double sqrt(double)"
1> при попытке сопоставить список аргументов "(int)"

Я новичок поэтому прошу помощи разобраться в чем ошибка.

Обновл. 12 Янв 2020 |

C++ не компилирует шаблоны функций напрямую. Вместо этого, когда компилятор встречает вызов шаблона функции, он копирует шаблон функции и заменяет типы параметров шаблона функции фактическими (передаваемыми) типами данных. Функция с фактическими типами данных называется экземпляром шаблона функции (или ещё «объектом шаблона функции»).

Рассмотрим это на практике. Во-первых, создадим шаблон функции:

Затем сделаем вызов шаблона функции:

Компилятор видит, что оба числа являются целочисленными, поэтому он копирует шаблон функции и создаёт экземпляр шаблона max(int, int) :

Это теперь уже «обычная функция». Допустим, что нам снова нужно вызвать max(), но уже с другим типом данных:

C++ автоматически создаёт экземпляр шаблона max(double, double) :

И затем компилирует его. Также стоит отметить, что, если вы создадите шаблон функции, но не вызовете его, то экземпляры этого шаблона созданы не будут.

Операторы, вызовы функций и шаблоны функций

Шаблоны функций работают как с фундаментальными типами данных (char, int, double и т.д.), так и с классами (но с нюансом). Экземпляр шаблона компилируется как обычная функция. В обычной функции любые операторы или вызовы других функций, которые используются в этой функции, должны быть определены/перегружены или вы получите ошибку компиляции. Аналогично, любые операторы или вызовы других функций, которые присутствуют в шаблоне функции, должны быть определены/перегружены для работы с фактическими (передаваемыми) типами данных. Рассмотрим это на практике.

Во-первых, создадим простой класс:

Теперь посмотрим, что произойдёт при попытке вызова функции max() с объектами класса Dollars:

Читайте также:  Как поменять язык в яндекс дзен

C++ создаст следующий экземпляр шаблона функции max():

А затем компилятор попытается скомпилировать эту функцию, но ничего не получится, так как C++ не имеет понятия, как обрабатывать выражение a > b ! Следовательно, это приведёт к ошибке:

Ошибка C2676 бинарный ">": "const T" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору

Сообщение об ошибке указывает на тот факт, что мы не перегрузили оператор > для класса Dollars. Давайте перегрузим:

Теперь C++ знает, как обрабатывать выражение a > b , когда в качестве переменных используются объекты класса Dollars!

Ещё один пример

Создадим шаблон функции, которая вычисляет среднее арифметическое элементов массива:

Как вы видите, всё отлично работает с фундаментальными типами данных!

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

Теперь посмотрим, что произойдёт при вызове функции average() с объектами класса Dollars:

1>c:userskiclisource
eposconsoleapplication10consoleapplication10consoleapplication10.cpp(37): error C2679: бинарный " with
1> [
1> T=Dollars
1> ]
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(508): note: может быть "std::basic_ostream &std::basic_ostream ::operator *)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(480): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(460): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(440): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(420): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(400): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(380): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(360): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(340): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(320): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(295): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(275): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(241): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(221): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(215): note: или "std::basic_ostream &std::basic_ostream ::operator c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(209): note: или "std::basic_ostream &std::basic_ostream ::operator &(__cdecl *)(std::basic_ios &))"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(204): note: или "std::basic_ostream &std::basic_ostream ::operator &(__cdecl *)(std::basic_ostream &))"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(702): note: или "std::basic_ostream &std::operator (std::basic_ostream &,const char *)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(749): note: или "std::basic_ostream &std::operator (std::basic_ostream &,char)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(787): note: или "std::basic_ostream &std::operator (std::basic_ostream &,const char *)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(834): note: или "std::basic_ostream &std::operator (std::basic_ostream &,char)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(960): note: или "std::basic_ostream &std::operator (std::basic_ostream &,const signed char *)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(967): note: или "std::basic_ostream &std::operator (std::basic_ostream &,signed char)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(974): note: или "std::basic_ostream &std::operator (std::basic_ostream &,const unsigned char *)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(981): note: или "std::basic_ostream &std::operator (std::basic_ostream &,unsigned char)"
1>c:program files (x86)microsoft visual studio2017communityvc oolsmsvc14.15.26726includeostream(1047): note: или "std::basic_ostream &std::operator (std::basic_ostream &,const std::error_code &)"
1>c:userskiclisource
eposconsoleapplication10consoleapplication10consoleapplication10.cpp(37): note: при попытке сопоставить список аргументов "(std::ostream, T)"
1> with
1> [
1> T=Dollars
1> ]

Читайте также:  Как обрезать видео в проигрывателе windows media

Компилятор сошёл с ума. Мы говорили о таких ошибках в предыдущем уроке. Несмотря на столь объёмный «результат», здесь всё довольно просто. В первых строках сообщается, что компилятор не смог найти перегрузку оператора Ошибка E0349 отсутствует оператор "

Помните, что average() возвращает объект класса Dollars, а мы пытаемся этот объект вывести с помощью оператора вывода class Dollars

Если же теперь запустить программу, то получим следующее:

Ошибка C2676 бинарный "+=": "T" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Ошибка C2676 бинарный "/=": "T" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору

Эти ошибки были вызваны экземпляром шаблона функции, созданным при вызове average(Dollars*, int) . Помните, что при вызове шаблона функции, компилятор копирует шаблон функции с типами параметров, а затем заменяет типы параметров шаблона на фактические (передаваемые) типы данных. Вот экземпляр шаблона функции average(), где T является классом Dollars:

Ссылка на основную публикацию
Операции сложения и умножения событий обладают свойством
1.4. Сложение и умножение вероятностей Событие А называется частным случаем события В, если при наступлении А наступает и В. То,...
Обзор монокуляров с алиэкспресс
Монокуляры активно применяются на охоте, во время путешествий, наблюдения за птицами и животными, при просмотре спортивных соревнований и в военных...
Область определения функции корень кубический из х
РЕШЕНИЕ:Корень 3 степени может извлекаться как из положительных чисел и 0, так и из отрицательных чисел Корень третьей степени можно...
Определение предела через эпсилон дельта
Тема 1. Предел функции Раздел: Предел и непрерывность функции Допустим, что функция определена в некоторой области . Будем рассматривать понятие...
Adblock detector