У меня проблемы с запуском следующего кода. Я получил это: ошибка 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> ]
Компилятор сошёл с ума. Мы говорили о таких ошибках в предыдущем уроке. Несмотря на столь объёмный «результат», здесь всё довольно просто. В первых строках сообщается, что компилятор не смог найти перегрузку оператора Ошибка E0349 отсутствует оператор "
Помните, что average() возвращает объект класса Dollars, а мы пытаемся этот объект вывести с помощью оператора вывода class Dollars
Если же теперь запустить программу, то получим следующее:
Ошибка C2676 бинарный "+=": "T" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Ошибка C2676 бинарный "/=": "T" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
Эти ошибки были вызваны экземпляром шаблона функции, созданным при вызове average(Dollars*, int) . Помните, что при вызове шаблона функции, компилятор копирует шаблон функции с типами параметров, а затем заменяет типы параметров шаблона на фактические (передаваемые) типы данных. Вот экземпляр шаблона функции average(), где T является классом Dollars: