Call of overloaded abs double is ambiguous что за ошибка
Заголовок <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.
А на этом всё, спасибо за внимание!
Подписывайтесь на канал , ставьте лайки, оставляйте комментарии - это помогает продвижению в Дзене.
Читайте также: