MK2 0 24 сентября, 2013 Опубликовано 24 сентября, 2013 · Жалоба работаю в IAR 6.40 есть класс, в котором определен оператор += class CL_StringLib { ///..... CL_StringLib & operator += (const uint8_t * addpoint ) { //.... return *this; } } далее в коде встречается использование этого оператора: .... Trip += ( (SPEED_UNITS)" Km":" M"); Trip += "mm"; .... и в первой строчке выдает ошибку Error[Pe349]: no operator "+=" matches these operands C:\..... operand types are: string_lib::CL_StringLib += char const * во второй Error[Pe349]: no operator "+=" matches these operands C:\.... operand types are: string_lib::CL_StringLib += char const [3] непонятно как так он не находит этого оператора и почему он пытается копировать массив в ф-цию оператора?! можно конечно отделаться сделав так: .... Trip += (const uint8_t *) ( (SPEED_UNITS)" Km":" M"); .... но хочется что бы было кошерно. будут какие-нибудь соображения как сделать лучше? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 37 24 сентября, 2013 Опубликовано 24 сентября, 2013 · Жалоба .... Trip += ( (SPEED_UNITS)" Km":" M"); Trip += "mm"; .... и в первой строчке выдает ошибку Error[Pe349]: no operator "+=" matches these operands C:\..... operand types are: string_lib::CL_StringLib += char const * во второй Error[Pe349]: no operator "+=" matches these operands C:\.... operand types are: string_lib::CL_StringLib += char const [3] непонятно как так он не находит этого оператора и почему он пытается копировать массив в ф-цию оператора?! Стринговая константа mm имеет тип "char const *", а потому она не соответствует параметру вашего оператора += (const uint8_t *), хотя бы уже потому, что второй беззнаковый, в отличие от первой. Про первую ошибку ответить невозможно, т.к. несказано, что означает фигня: (SPEED_UNITS). Компилятор выдал предельно точную диагностику - у вас несоответствие типов между декларируемым оператором и закладываемых в него параметров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MK2 0 24 сентября, 2013 Опубликовано 24 сентября, 2013 · Жалоба Стринговая константа mm имеет тип "char const *", а потому она не соответствует параметру вашего оператора += (const uint8_t *), хотя бы уже потому, что второй беззнаковый, в отличие от первой. Про первую ошибку ответить невозможно, т.к. несказано, что означает фигня: (SPEED_UNITS). Это мысль проверить знаковыи или не знаковыи у меня char! вариации с const к успеху не привели. хотя в том же классе есть ф-ция-член типа void CL_StringLib::Add(const uint8_t * string_point); которая спокоино проглатывает "char const *" !! строчка с (SPEED_UNITS) должна выглядить так ( (SPEED_UNITS) ? " Km":" M"); там немного более сложное условие, но ни в том ни другом виде это не влияет на ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 37 24 сентября, 2013 Опубликовано 24 сентября, 2013 · Жалоба И все-таки проверьте - определите параметры вашего оператора так: void CL_StringLib::Add(const char *); т.е. в буквальном соответствии со строковой константой. И посмотрите, пропадет ли ошибка в строке Trip += "mm"; Дело в том, что в хидере stdint.h тип uint8_t может быть определен не как unsigned char, а каким-нибудь вычурным способом, вроде: typedef __UINT8_T_TYPE__ uint8_t; и тогда компилятор не сможет догадаться, что char и uint8_t синонимичны. Для С++ вообще характерно считать разными все определения, которые по-разному пишутся. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tiro 0 24 сентября, 2013 Опубликовано 24 сентября, 2013 · Жалоба Для С++ вообще характерно считать разными все определения, которые по-разному пишутся. :) Средство typedef вводит синоним существующего типа, а не новый тип. Вот хотя бы в Бьерн Страуструп. Язык программирования С++. Второе дополненное издание. Смотрите раздел 2.3.9. Хотя это не поможет ТС. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
A. Fig Lee 0 25 сентября, 2013 Опубликовано 25 сентября, 2013 · Жалоба Speed_units знак вопроса включает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MK2 0 25 сентября, 2013 Опубликовано 25 сентября, 2013 · Жалоба И все-таки проверьте - определите параметры вашего оператора так: void CL_StringLib::Add(const char *); т.е. в буквальном соответствии со строковой константой. И посмотрите, пропадет ли ошибка в строке Trip += "mm"; определил так. теперь ошибка пропала в обоих строках. посмотрел какои у меня char: так что непонятно почему он не хочет совмещать uint8_t и char! Далее выяснилось вот что. Ф-ция член void inline Add( uint8_t const * addpoint) спокоино програтывает строки в ф-циях вне класса типа Trip.Add("fdf"); Но выдает ошибку в теле ф-ции оператора += CL_StringLib & operator += ( uint8_t const * addpoint ) { Add(addpoint); return *this; } пишет Error[Pe167]: argument of type "char const *" is incompatible with parameter of type "uint8_t const *" C:\..... 83 Speed_units знак вопроса включает? да включает, даже если убрать условие, дело это не меняет (( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 25 сентября, 2013 Опубликовано 25 сентября, 2013 · Жалоба Далее выяснилось вот что.Вы упорно отказываетесь признать, что char, unsigned char и signed char - это три разных типа. Первый предназначен для работы с символами и строками символов, последние два (как и (u)int8_t) - для работы с числами. Вы же упорно пытаетесь функцию, работающую со строками описать как работающую через указатель с числами, получаете в лоб ручкой собственных граблей но продолжаете топтаться по ним. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MK2 0 25 сентября, 2013 Опубликовано 25 сентября, 2013 · Жалоба Вы упорно отказываетесь признать, что char, unsigned char и signed char - это три разных типа. Первый предназначен для работы с символами и строками символов, последние два (как и (u)int8_t) - для работы с числами. Вы же упорно пытаетесь функцию, работающую со строками описать как работающую через указатель с числами, получаете в лоб ручкой собственных граблей но продолжаете топтаться по ним. я не отрицаю что это три разных типа, мне непонятно почему ф-ция объявленная как void Add(const uint8_t * point) не выдает даже варнингов в строчках типа Trip.Add("Rm"); а при применение оператора вызывает ошибку! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Гость MALLOY2 25 сентября, 2013 Опубликовано 25 сентября, 2013 · Жалоба Думаю дело тут в promoution. Где то в стандарте расписано. Дело в том что в С++ можно перегружать функции, фактически компилятор ищет функцию которая может подойти под ваши параметры, и если ее нету он может расширить (promoution) параметр по определенным правилам. Но с перегрузкой операторов такое не прокатит !!!! P.S. uint8_t != char, uint8_t != signed char, uint8_t != unsigned char. Т.к. char может быть и 16 бит (как у TMS320C55xx) и он может иметь значение 10000, а uint8_t хоть и будет 16 бит в памяти занимать на такой платформе от не сможет принять такое значение, так как компилятор будет маску на него накладывать и в этой переменно всегда будет число в диапазоне 8 бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MK2 0 25 сентября, 2013 Опубликовано 25 сентября, 2013 · Жалоба Думаю дело тут в promoution. Где то в стандарте расписано. Дело в том что в С++ можно перегружать функции, фактически компилятор ищет функцию которая может подойти под ваши параметры, и если ее нету он может расширить (promoution) параметр по определенным правилам. Но с перегрузкой операторов такое не прокатит !!!! я тоже так подумал бы, если бы не одно но: { .... void CL_StringLib::Add(const char *); ..... CL_StringLib & operator += ( char const * addpoint ) { Add(addpoint); return *this; } то в строчке "Add(addpoint);" выдает ошибка Error[Pe167]: argument of type "char const *" is incompatible with parameter of type "uint8_t const *" если в исользовать ф-ции Add вне класса типа String.Add("dfdf"); не выдается даже ворнинга! Т.е. как-то он не всегда расширяет параметры! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 25 сентября, 2013 Опубликовано 25 сентября, 2013 · Жалоба не выдается даже ворнинга! Т.е. как-то он не всегда расширяет параметры! Попробуйте так: char const * Tmp = "dfdf"; String.Add(Tmp); Получите искомую ошибку. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MK2 0 25 сентября, 2013 Опубликовано 25 сентября, 2013 · Жалоба Получите искомую ошибку. Все теперь ошибка появилось.... я могу быть спокоен :laugh: Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_t Cпасибо Всем за обсуждение! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DASM 0 26 сентября, 2013 Опубликовано 26 сентября, 2013 · Жалоба Ура, ошибка появилась ! я могу быть спокоен, да здравствует с++ :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 26 сентября, 2013 Опубликовано 26 сентября, 2013 · Жалоба Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_tНет, он ничего не интерпретирует. Строка - это константный массив char. Этот массив при необходмости неявно приводится к указателю на первый элемент массива. Ваш компилятор С++ почему-то позволяет неявно привести и к указателю на const char и к указателю на const uint8_t. Вероятно потому, что char у вас в настройках компилятора сделан беззнаковым. gcc выдает ошибку и на String.Add("dfdf"); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться