МЕНЮ
  • Салон
  • Советы
  • Топливо
  • Трансмиссия
  • Тюнинг
  • Управление
  • Контакты

Call of overloaded abs double is ambiguous что за ошибка

Обновлено: 05.06.2026

Заголовок <math.h> является заголовком C std lib. Он определяет много вещей в глобальном пространстве имен. Заголовок <cmath> - это С++-версия этого заголовка. Он определяет по существу тот же самый материал в пространстве имен std . (Есть некоторые отличия, например, версия С++ поставляется с перегрузками некоторых функций, но это не имеет значения.) Заголовок <cmath.h> не существует.

Поскольку поставщики не хотят поддерживать две версии того, что по сути является одним и тем же заголовком, они придумали разные возможности, чтобы иметь только одну из них за кулисами. Часто, что заголовок C (поскольку компилятор С++ способен разобрать это, в то время как противоположное не будет работать), а заголовок С++ включает это и вытаскивает все в пространство имен std . Или есть макрос магии для разбора одного и того же заголовка с или без namespace std , обернутых вокруг него или нет. Для этого добавьте, что в некоторых средах это неудобно, если заголовки не имеют расширения файла (например, редакторы не могут выделить код и т.д.). Таким образом, некоторые поставщики имели бы <cmath> как однострочный, включая другой заголовок с расширением .h . Или некоторые из них будут отображать все, включая сопоставление <cblah> с <blah.h> (которое с помощью макроса становится заголовком С++, когда __cplusplus определено и в противном случае становится заголовком C) или <cblah.h> или что-то еще.

По этой причине на некоторых платформах, включая такие, как <cmath.h> , которые не должны существовать, изначально удастся, хотя это может привести к тому, что компилятор не будет эффектно позже.

Я не знаю, какую версию std lib вы используете. Я предполагаю, что это тот, который поставляется с GCC, но этого я не знаю, поэтому я не могу точно объяснить, что произошло в вашем случае. Но это, безусловно, сочетание одного из вышеупомянутых хакеров, связанных с продавцом, и вы включаете заголовок, который вы не должны были включать в себя. Возможно, это тот, где <cmath> отображается на <cmath.h> с определенным (набором) макросов, которые вы не определили, так что вы оказались с обоими определениями.

Обратите внимание, что этот код еще не должен компилироваться:

В глобальном пространстве имен не должно быть abs() (it std::abs() ). Однако в соответствии с описанными выше трюками реализации вполне может быть. Портирование такого кода позже (или просто попытка скомпилировать его с вашей следующей версией поставщика, что не позволяет этого) может быть очень утомительным, поэтому вам следует следить за этим.

Составитель информация (Не уверен, если это имеет значение):

Заголовок является заголовком С стандом Lib. Она определяет много вещей в глобальном пространстве имен. Заголовок является версией C ++ этого заголовка. Он определяет , по существу, те же вещи в пространстве имен std . (Есть некоторые различия, как и в C ++ версии поставляется с перегрузками некоторых функций, но это не имеет значения.) Заголовок не существует.

Вот причина , почему на некоторых платформах , включая такие вещи , как , что не должно существовать, первоначально будет иметь успех, хотя это может сделать компилятор не в состоянии эффектно позже.

Я понятия не имею , который STD Lib реализации вы используете. Я предполагаю , что это тот , который поставляется с GCC, но я не знаю, поэтому не могу точно объяснить , что произошло в вашем случае. Но это, конечно, смесь одного из указанных выше конкретных поставщиков писак , и вы в том числе заголовок , вы не должны быть включены сами. Может быть , это тот , где сопоставляется с конкретным (набор) макрос (ы) , которые вы не определили, так что вы в конечном итоге с обоих определений.

Однако следует отметить, что этот код еще не должен составлять:

Там не должно быть abs() в глобальном пространстве имен (это std::abs() ). Тем не менее, в соответствии с описанными выше трюков реализации, может быть. Портирование такой код позже (или просто пытается скомпилировать его с следующей версии вашего поставщика , который не позволяет это) может быть очень утомительным, так что вы должны следить за этим.

у меня есть следующий код на языке C:

и make взрывается на:

Как я могу указать, что компилятор должен вызвать abs() в cmath.h, которые могут обрабатывать плавает?

Компилятор info (Не уверен, если это имеет значение):

I have the following C++ code:

and make blows up on:

also of interest:

How can I specify that the compiler needs to call the abs() in cmath.h that can handle floats?

Compiler info (Not sure if this matters):

4 Answers 4

Note, however, that this code still ought not to compile:

Только начал программировать. Пока написал только вот это.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

for (byte i = 0; i < 8; i++)

А чтобы понять, надо почитать описание Serial.write.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вы предлагаете передавать данные побайтно?

" Данные послаются как один или серия байтов "

Мне нужно послать все данные массива, т.е. как серию байтов.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

а они внутри функции всё равно побайтно передадутся. так что это полный аналог. но если очень хочется так, то вот так.

Serial .write(&Inputs[0], 8);

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Пишет no matching function for call to 'HardwareSerial::write(word*, int)'

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

ЕвгенийП аватар

Пишет no matching function for call to 'HardwareSerial::write(word*, int)'

Ну и правильно пишет. Если у Вас массив байтов, так нафига Вы его обозвали word в 6-ой строке? Пишите byte

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Обозвал. Снова пишет "call of overloaded 'write(byte&, byte&)' is ambiguous"

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

та итить колотить, поставтье наконец-то & перед Inputs.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Превращение значения в адрес, где оно хранится. Inputs -- массив, то бишь адрес начала хранения теперь байтиков в количестве 8 шт. Квадратные скобки и чиселко в них: [0] -- указание взять ЗНАЧЕНИЕ, лежащее в нулевом байтике от начала (адреса) "Inputs". А Вам надо передать в функцию не значение а адрес .. вот унарная операция & и возвращает адрес места хранения указанного значения. Правильно прочитав вышеизложенное, можно поступать "двояко":

1. Serial .write(&(Inputs[0]), x); -- получить адрес элемента массива (не обязательно 0..)

2. Serial .write(Inputs, x); -- сам Inputs является адресом нулевого элемента массива (но только 0)..

Пишу класс с использованием Стандартной Библиотеки, который будет доставать данные из индикаторов (в данном случае - таймсерии).

В классе объявлю две виртуальные функции:

virtual void GetData(CiOpen* poOpen);
virtual void GetData(CiClose* pcClose);

Каждая из этих функций берет данные из соответствующего объекта-таймсерии, и сохраняет во внутренней переменной.

Теперь объявляем функцию, в которую будем передавать указатель на нужный объект ( то ли CiOpen, то ли CiClose):

double GetResult(CSeries * psSeries)
<
GetData(psSeries);

Однако, пишет ошибку "ambiguous call to overloaded function" .

Странно - я думал, в этом и заключается позднее связывание - что функции определяются в момент создания объекта, а выходит, что нам уже сейчас, во время компиляции надо знать, какой именно объект будет вызывать данную ВИРТУАЛЬНУЮ функцию. При этом если одну из функций убрать (скажем, оставить только одну функцию с CiOpen) - то все в порядке, несмотря на передачу указателя CSeries, вызывается правильная функция с объектом CiOpen.

Что-то я не вполне пойму концепцию виртуальных функций.

Интересно, что если объявить функцию

virtual void GetData(CSeries* pcClose)

То никаких проблем не возникает, однако, и никакой витуальности тоже - просто вызывается эта, последняя функция. А как же с виртуальностью ?

  • Тренд и уровни
  • Результаты оптимизации отличаются от одиночных тестирований по ним
  • FAQ по сервису Сигналы

Теперь объявляем функцию, в которую будем передавать указатель на нужный объект ( то ли CiOpen, то ли CiClose):

double GetResult(CSeries * psSeries)
<
GetData(psSeries);

а кто чей потомок?

Если CSeries родитель, то вы должны перед вызовом GetData определить таки чье же оно.

и преобразовать его в зависимости от типа пришедшего psSeris

А как определить принадлежность пришедшего psSeries в GetResult - к iOpen или iClose - можете придумать сами.

Б лагодарю за оперативный ответ

а кто чей потомок?

Ну, в Стандартной Библиотеке общий предок - это CSeries, а CiOpen и CiClose - потомки. Я этим же и пользуюсь. Собственно, хотел сделать что-то вроде паттерна "Посетитель" - чтобы можно было универсально доставать данные из любого объекта-наследника от CSeries.

Если CSeries родитель, то вы должны перед вызовом GetData определить таки чье же оно.

и преобразовать его в зависимости от типа пришедшего psSeris

А как определить принадлежность psSeries к iOpen или iClose - можете придумать сами.

То есть, сам CiOpen или CiClose - "не знает", кто он такой, и какие функции ему принадлежат ? То есть, все, даже виртуальные функции должны быть известны уже на этапе компиляции ?

А в чем тогда виртуальность функции ? В примере из документации (с фигурами тетрис) вызывается m_shape.Draw() - причем, как я понимаю, сама переменная m_shape - как раз имеет тип предка, а вовсе не одного из потомков.

Я думал, что виртуальные функции тем и отличаются, что конкретная перегруженная функция определяется во время создания объекта - и дальше, несмотря на то, что указатель преобразовывается к указателю на предка, функция остается прежней. Значит, в MQL - так нельзя ?

Б лагодарю за оперативный ответ

Ну, в Стандартной Библиотеке общий предок - это CSeries, а CiOpen и CiClose - потомки. Я этим же и пользуюсь. Собственно, хотел сделать что-то вроде паттерна "Посетитель" - чтобы можно было универсально доставать данные из любого объекта-наследника от CSeries.

То есть, сам CiOpen или CiClose - "не знает", кто он такой, и какие функции ему принадлежат ? То есть, все, даже виртуальные функции должны быть известны уже на этапе компиляции ?

А в чем тогда виртуальность функции ? В примере из документации (с фигурами тетрис) вызывается m_shape.Draw() - причем, как я понимаю, сама переменная m_shape - как раз имеет тип предка, а вовсе не одного из потомков.

Я думал, что виртуальные функции тем и отличаются, что конкретная перегруженная функция определяется во время создания объекта - и дальше, несмотря на то, что указатель преобразовывается к указателю на предка, функция остается прежней. Значит, в MQL - так нельзя ?

Вы немного по разному интерпретируете виртуальность функций. Сравните даже Ваш пример и то, что Вы делаете:

Есть множество фигур (которые все наследники от Shape). у каждой есть метод draw(), который был и у предка. (метод функции!)

Теперь можно задать массив фигур Shape, запихнуть туда разные фигуры (фигуры-потомки) и для каждой вызвать ее метод draw

Это и есть виртуальность

Есть два потомка (open и close) и две функции (с одинаковым названием), одна принимает объект класса open, вторая объект класса close.

Очень коротко - ошибка про ambiguous означает, что база данных не знает из какой из таблиц брать поле. У вас в запросе есть JOIN с одной или более таблиц и вы выбираете * (звездочку) или поле без указания имени таблиц или ее alias (если он указан).

Например, есть таблицы foo (с полями id, name, bar_id) и bar (с полями id, name). Если сделать такой запрос:

То вы получите ошибку про ambiguous, так как и id и name есть в обеих таблицах. То же самое применимо к секциям про GROUP BY, ORDER BY, HAVING и т.д.

Важное знание

Очень важно знать - когда делаешь join всегда пиши alias таблиц перед всеми полями. Если этого не сделать, то запрос даже если сразу не будет падать по ambiguous, может работать до тех пор, пока в одну из таблиц не добавят поле с таким же именем. Часто это всякие user_id, creation_time и пр. А если у вас не 100% покрытие тестами (зуб даю), и тестировщик не заметит, то в продакшене будет а-та-та!

То же самое другими словами

У вас в актовом зале школы два или три класса и завучу надо позвать Васю (6А), Петю (7А) и Колю (10Б). Вот только Коли и Васи есть больше, чем в одном классе, но в одном классе есть только один человек с таким именем (это для упрощения, ведь в одной таблице не может быть двух полей с одинаковыми именами).

Значит завучу просто надо сказать Коля из 10Б и Вася из 6А и Петя из 7А подойдите, пожалуйста.

Петю, конечно, можно позвать и так, если завуч уверен, что Петя в школе всего один) Но может еще какой-то Петя туда пришел, а никто и не знает.

UNION ALL

Важно отметить, что на практике часто встречаю, что народ делает JOIN и получает ambiguous в случае, когда join и нужен-то не был, а надо было просто из двух разных таблиц получить одни и те же поля. Делают примерно такое:

А на самом деле хотят такое:

SELECT Date, CampaignId, CampaignName
FROM tbl1

SELECT Date, CampaignId, CampaignName
FROM tbl2

Статей про базы данных на канале много, так что, подписывайтесь, чтобы не пропустить =) Есть и про Postgres и про BigQuery, но если в целом - то ansi sql standard штука базовая и много статей часто одинаково применимы к любым базам данных, включая sql.

А на этом всё, спасибо за внимание!

Подписывайтесь на канал , ставьте лайки, оставляйте комментарии - это помогает продвижению в Дзене.

Читайте также:

      
  • Р1176 ошибка фольксваген пассат б5 расшифровка
  •   
  • Тойота прадо код ошибки 12
  •   
  • Не горит ближний свет форд мондео 3
  •   
  • Шевроле круз горит знак стабилизации
  •   
  • Ошибка p2006 toyota prado
  • Контакты
  • Политика конфиденциальности