Call of overloaded abs double is ambiguous что за ошибка
Не удалось разрешить указанный перегруженный вызов функции. Может потребоваться явное приведение одного или нескольких фактических параметров.
Эту ошибку также можно получить с помощью шаблона. Если в одном и том же классе есть обычная функция-член и шаблонная функция-член с одинаковой сигнатурой, то шаблон должен быть первым. Это ограничение остается в текущей реализации Visual C++.
Примеры
Следующий пример приводит к возникновению ошибки C2668:
Другим способом устранения этой ошибки является объявление:
Преобразование в приведение с использованием константы 0 является неоднозначным, так как int требует преобразования как в long , так и в void* . Чтобы устранить эту ошибку, приведите 0 к точному типу параметра функции, для которого она используется. Не нужно выполнять преобразования.
Эта ошибка может возникать, если CRT теперь float имеет double формы и все математические функции.
Эта ошибка может возникать из-за того, что объект pow(int, int) был удален из math.h в CRT.
этот код успешно выполняется в Visual Studio 2015, но в Visual Studio 2017 и более поздних версий с C2668 происходит сбой. в Visual Studio 2015 компилятор ошибочно обрабатывает инициализацию копирования списка таким же образом, как и обычная инициализация копирования. Он рассматривал только преобразование конструкторов для разрешения перегрузки.
string::size() returns size_t , and sqrt doesn’t accept it in any of its versions. So the compiler has to cast, and cannot choose to what – all of them are OK. You have to put explicit cast:
The problem is that in C++, there are three functions named sqrt – one taking in a float , one taking a double , and one taking a long double . When you try calling
The compiler tries to determine which of these functions you want to call. Since aux.size() returns a string::size_type , which is neither a float , double , nor long double , it tries to see if string::size_type is implicitly convertible to any of these three. But since string::size_type is convertible to all three of these types, the compiler marks the call as ambiguous, since it’s unclear which of the conversions you want to do.
To fix this, you can explicitly cast aux.size() to the type that you want. For example:
This makes the call unambiguously match one of the two functions. Depending on the precision you want, you can choose any of the three overloads. Since you’re just casting back to an int , it’s probably fine to cast to a float here.
I’m having some problems runnning the following code. I got this: error C2668: ‘pow’ : ambiguous call to overloaded function. I’ve tried to manually cast the arguments to the appropiate type using static_cast, however I think I get some pointer errors?!
The program should convert a number from base 16 to base 10.
Those are all the errors.
How can I fix this? Thank you.
4 Answers 4
strlen return type is size_t in C++. So you can resolve the ambiguity via casting:
and main should return int instead of void :
Though you marked your question as a C question you actually compile your program as a C++ program because it is C++ that allows to overload functions.
In your case the C++ compiler is unable to select an appropriate overloaded function pow. The error message clear shows what functions the compiler considers. To remove the ambiguity you could call the function for example the following way
In this case the compiler would use function
Take into account that in C/C++ function main shall have return type int .
In C the function is defined as
while in C++ it is usually defined as
And I think there is a typo
Instead of the string literal "A" there shall be character literal ‘A’
In C language we can find library function under math.h:
In C++ language we able to have set of overloaded functions under cmath such as:
Since you were using C style programming but compiled using C++ compiler,compiler might face with ambiguity states with defined function in math library,therefore you should convert your argument appropriately according to function definition 1 as mentioned above,therefore change your code as,
ALSO NOTED with in your given code snippet there is a mistake as Perreal noted
Я получаю ошибку, например..
и когда я пытаюсь вызвать function(1.2,2) или function(1,2.2) , он печатает как " функция int"
Пожалуйста, уточните, когда вызывается function(float y,float w) ?
Вызов любой из функций потребует усечения, поэтому ни один из них не является предпочтительным по сравнению с другим. Я подозреваю, что вы действительно хотите void function(double y,double w) . Помните, что в C/С++ тип с плавающей запятой по умолчанию для литералов и передачи параметров – double, NOT float.
UPDATE
Если вы действительно не хотите менять подпись функции с float на double, вы всегда можете использовать литералы, которые напечатаны как float. Если вы добавите суффикс f к номерам с плавающей запятой, они будут напечатаны с плавающей запятой.
Вашими примерами будут function(1.2f, 2f) и function(1, 2.2f) .
Что такое перегрузка оператора?
Почему две версии function в OP допускаются к существованию?
Обратите внимание, что они принимают разные типы параметров функций ( int и float ) и, следовательно, квалифицируются как допустимые перегрузки функций.
Что такое разрешение перегрузки?
Это процесс выбора наиболее подходящей функции/оператора с помощью реализации компилятора. Если существует наилучшая жизнеспособная функция и она уникальна, разрешение перегрузки преуспевает и приводит к ее результату. В противном случае разрешение перегрузки завершается с ошибкой, и вызов обрабатывается как плохо сформированный, а компилятор предоставляет диагностику. Компилятор использует неявная последовательность преобразований, чтобы найти наилучшую функцию соответствия.
С++ 03 Стандарт 13.3.3.1 Неявные преобразования:
Неявная последовательность преобразования представляет собой последовательность преобразований, используемых для преобразования аргумента в вызов функции к типу соответствующего параметра вызываемой функции.
Неявные последовательности преобразования могут быть одной из следующих категорий:
- Стандартная последовательность преобразования (13.3.3.1.1)
- Пользовательская последовательность преобразований (13.3.3.1.2)
- Последовательность преобразования многоточия (13.3.3.1.3)
Обратите внимание, что каждый из них оценивается для определения наилучшей жизнеспособной функции. Лучшая жизнеспособная функция – это та, у которой параметры имеют либо более совершенные, либо равноценные неявные последовательности преобразований, чем все другие жизнеспособные функции. Стандартная информация подробно описана в каждом из этих разделов. Стандартная последовательность преобразования имеет отношение к этому случаю, она суммируется как:
С достаточным фоном для перегрузки разрешения.
рассмотрим примеры кода в OP:
Важное правило: 1.2 и 2.2 являются литералами, и они рассматриваются как тип данных double .
Во время отображения неявных преобразований:
Оба литерала параметров функции с типом double нуждаются в ранге преобразования, чтобы либо вызвать версию float , либо int , и ни одна из них не лучше, чем другая, они точно совпадают с рангом конверсии. Компилятор не может определить наилучшее жизнеспособное соответствие, и он сообщает о двусмысленности.
При отображении последовательности неявных преобразований:
Один из параметров функции 2 имеет точное соответствие с версией функции int , а другой 1.2 имеет ранг преобразования. Для функции, которая принимает float в качестве параметров, неявные последовательности преобразования для обоих параметров имеют ранг преобразования.
Таким образом, функция, которая принимает версию int , лучше, чем версия float , и является наилучшим совпадением и получает вызов.
Как разрешить перегрузку ошибок неоднозначности?
Если вы не хотите, чтобы неявное преобразование последовательности преобразований выбрасывало вас, просто предоставляйте функции и вызывайте их таким образом, чтобы параметры были точно совпадают. Поскольку точное совпадение очков над всеми остальными, у вас есть определенная гарантия того, что ваша желаемая функция будет вызвана. В вашем случае есть два способа сделать это:
Решение 1:
Вызвать функцию так, чтобы параметры были точно соответствуют доступным функциям.
Так как 1.2f и 2.2f рассматриваются как типы float , они точно соответствуют версии функции float .
Решение 2:
Предоставить функцию перегрузки, которая точно соответствует типу параметра в вызываемой функции.
Так как 1.2 и 2.2 рассматриваются как double , вызываемая функция точно соответствует этой перегрузке.
Здравствуйте. При компиляции некоторых примеров из MS DirectX SDK (June 2010) происходит ..\..\DXUT\Core\DXUTenum.cpp(3976): error С2668: 'abs': ambiguous call to overloaded function . Text3D в папке "Samples\C++\Direct3D\" напрочь отказывается компилировать. Компилятор: VC++14 Update 3.
Англ источники в решении проблемы особо-то и не помогли. Что с этим делать, пока ума не могу приложить. Соответственно, влезть в строку 3976 я не могу т.к. после редактировании любого инклюда с DXUT студия выдает ошибку при линковке. Может кто-нибудь сталкивался с подобным при работе с новыми компиляторами и D3D9? Что с этим делать?
DirectX SDK скачал из официального сайта. Ссылку искать не буду, да и не вспомню, ибо давно. Собираю под Win32/Debug mode, исходник, как и другие ресурсы в семплах оригинальный. Если запущу свой старенький комп с AMD процессором, на нем есть VS2010 и тот SDK, постараюсь построить проект там.
Компилятор информация (не уверен, если это имеет значение):
Заголовок в это заголовок с СТД Либ. Он определяет многое в глобальном пространстве имен. Заголовок в это C++ версии этого заголовка. Оно определяет, по существу, те же вещи в пространстве имен STD и. (Есть некоторые различия, как в C++ версии поставляется с перегрузками некоторые функции, но это вовсе'т вопрос.) Заголовок не'т существуют.
Что's причина, почему на некоторых платформах, включая такие вещи, как , которые не должны существовать, вначале получится, хотя это может сделать компилятор внушительный провал в дальнейшем.
Я понятия не имею, что СТД реализации Либ вы используете. Я предполагаю, что это'ы, который поставляется с GCC, но я не'т знаю, поэтому я не могу точно объяснить, что произошло в вашем случае. Но это'ы, конечно, смесь одного из вышеперечисленных вендора хаки, и вы в том числе заголовок, вы не должны были включаться самостоятельно. Может быть, это'С, где в карты с определенным (набор) макрос(ы), которые вы бы'т определен, так что у вас оба определения.
Заметим, однако, что этот код еще не должны составлять:
Там должны'т-АБС () в глобальном пространстве имен (он'ы СТД::АБС() ). Однако, как и в выше описанных трюков реализации, там вполне могли быть. Портирование такой код позже (или просто пытаюсь скомпилировать его с поставщиком's в следующей версии, которая не'т допустить этого) может быть чрезвычайно утомительно, так что вы должны держать глаза на это.
Читайте также: