|
Определение оператора класса, странная ошибка |
|
|
|
Sep 24 2013, 17:12
|

Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535

|
работаю в 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"); .... но хочется что бы было кошерно. будут какие-нибудь соображения как сделать лучше?
|
|
|
|
|
Sep 24 2013, 18:39
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(MK2 @ Sep 24 2013, 21:12)  Код .... 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). Компилятор выдал предельно точную диагностику - у вас несоответствие типов между декларируемым оператором и закладываемых в него параметров.
|
|
|
|
|
Sep 24 2013, 20:56
|

Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535

|
Цитата(Xenia @ Sep 24 2013, 21:39)  Стринговая константа 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"); там немного более сложное условие, но ни в том ни другом виде это не влияет на ошибку.
|
|
|
|
|
Sep 24 2013, 21:17
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
И все-таки проверьте - определите параметры вашего оператора так: Код void CL_StringLib::Add(const char *); т.е. в буквальном соответствии со строковой константой. И посмотрите, пропадет ли ошибка в строке Код Trip += "mm"; Дело в том, что в хидере stdint.h тип uint8_t может быть определен не как unsigned char, а каким-нибудь вычурным способом, вроде: Код typedef __UINT8_T_TYPE__ uint8_t; и тогда компилятор не сможет догадаться, что char и uint8_t синонимичны. Для С++ вообще характерно считать разными все определения, которые по-разному пишутся.
|
|
|
|
|
Sep 25 2013, 09:51
|

Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535

|
Цитата(Xenia @ Sep 25 2013, 00:17)  И все-таки проверьте - определите параметры вашего оператора так: Код 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 Цитата(A. Fig Lee @ Sep 25 2013, 06:08)  Speed_units знак вопроса включает? да включает, даже если убрать условие, дело это не меняет ((
|
|
|
|
|
Sep 25 2013, 12:04
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (MK2 @ Sep 25 2013, 11:51)  Далее выяснилось вот что. Вы упорно отказываетесь признать, что char, unsigned char и signed char - это три разных типа. Первый предназначен для работы с символами и строками символов, последние два (как и (u)int8_t) - для работы с числами. Вы же упорно пытаетесь функцию, работающую со строками описать как работающую через указатель с числами, получаете в лоб ручкой собственных граблей но продолжаете топтаться по ним.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 25 2013, 13:01
|

Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535

|
Цитата(Сергей Борщ @ Sep 25 2013, 15:04)  Вы упорно отказываетесь признать, что char, unsigned char и signed char - это три разных типа. Первый предназначен для работы с символами и строками символов, последние два (как и (u)int8_t) - для работы с числами. Вы же упорно пытаетесь функцию, работающую со строками описать как работающую через указатель с числами, получаете в лоб ручкой собственных граблей но продолжаете топтаться по ним. я не отрицаю что это три разных типа, мне непонятно почему ф-ция объявленная как void Add(const uint8_t * point) не выдает даже варнингов в строчках типа Trip.Add("Rm"); а при применение оператора вызывает ошибку!
|
|
|
|
|
Sep 25 2013, 15:29
|

Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535

|
Цитата(MALLOY2 @ Sep 25 2013, 17:02)  Думаю дело тут в 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"); не выдается даже ворнинга! Т.е. как-то он не всегда расширяет параметры!
|
|
|
|
|
Sep 25 2013, 16:16
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (MK2 @ Sep 25 2013, 17:29)  не выдается даже ворнинга! Т.е. как-то он не всегда расширяет параметры! Попробуйте так: CODE char const * Tmp = "dfdf"; String.Add(Tmp); Получите искомую ошибку.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 25 2013, 19:36
|

Местный
  
Группа: Свой
Сообщений: 202
Регистрация: 30-10-10
Пользователь №: 60 535

|
Цитата(Сергей Борщ @ Sep 25 2013, 19:16)  Получите искомую ошибку. Все теперь ошибка появилось.... я могу быть спокоен Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_t Cпасибо Всем за обсуждение!
|
|
|
|
|
Sep 26 2013, 10:11
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (MK2 @ Sep 25 2013, 21:36)  Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_t Нет, он ничего не интерпретирует. Строка - это константный массив char. Этот массив при необходмости неявно приводится к указателю на первый элемент массива. Ваш компилятор С++ почему-то позволяет неявно привести и к указателю на const char и к указателю на const uint8_t. Вероятно потому, что char у вас в настройках компилятора сделан беззнаковым. gcc выдает ошибку и на String.Add("dfdf");
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|