реклама на сайте
подробности

 
 
> Определение оператора класса, странная ошибка
MK2
сообщение Sep 24 2013, 17:12
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 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");
....


но хочется что бы было кошерно.
будут какие-нибудь соображения как сделать лучше?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MALLOY2
сообщение Sep 25 2013, 14:02
Сообщение #2


Знающий
****

Группа: Validating
Сообщений: 838
Регистрация: 31-01-05
Пользователь №: 2 317



Думаю дело тут в promoution. Где то в стандарте расписано. Дело в том что в С++ можно перегружать функции, фактически компилятор ищет функцию которая может подойти под ваши параметры, и если ее нету он может расширить (promoution) параметр по определенным правилам. Но с перегрузкой операторов такое не прокатит !!!!

P.S. uint8_t != char, uint8_t != signed char, uint8_t != unsigned char. Т.к. char может быть и 16 бит (как у TMS320C55xx) и он может иметь значение 10000, а uint8_t хоть и будет 16 бит в памяти занимать на такой платформе от не сможет принять такое значение, так как компилятор будет маску на него накладывать и в этой переменно всегда будет число в диапазоне 8 бит.
Go to the top of the page
 
+Quote Post
MK2
сообщение Sep 25 2013, 15:29
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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");

не выдается даже ворнинга!
Т.е. как-то он не всегда расширяет параметры!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 25 2013, 16:16
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
MK2
сообщение Sep 25 2013, 19:36
Сообщение #5


Местный
***

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



Цитата(Сергей Борщ @ Sep 25 2013, 19:16) *
Получите искомую ошибку.

Все теперь ошибка появилось.... я могу быть спокоен laugh.gif
Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_t
Cпасибо Всем за обсуждение!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 26 2013, 10:11
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- MK2   Определение оператора класса   Sep 24 2013, 17:12
- - Xenia   Цитата(MK2 @ Sep 24 2013, 21:12) Код.... ...   Sep 24 2013, 18:39
|- - MK2   Цитата(Xenia @ Sep 24 2013, 21:39) Стринг...   Sep 24 2013, 20:56
- - Xenia   И все-таки проверьте - определите параметры вашего...   Sep 24 2013, 21:17
|- - Tiro   Цитата(Xenia @ Sep 25 2013, 00:17) Для С+...   Sep 24 2013, 23:20
- - A. Fig Lee   Speed_units знак вопроса включает?   Sep 25 2013, 03:08
- - MK2   Цитата(Xenia @ Sep 25 2013, 00:17) И все-...   Sep 25 2013, 09:51
|- - Сергей Борщ   QUOTE (MK2 @ Sep 25 2013, 11:51) Далее вы...   Sep 25 2013, 12:04
|- - MK2   Цитата(Сергей Борщ @ Sep 25 2013, 15:04) ...   Sep 25 2013, 13:01
|- - MK2   Цитата(Сергей Борщ @ Sep 26 2013, 13:11) ...   Sep 26 2013, 15:44
|- - Сергей Борщ   QUOTE (MK2 @ Sep 26 2013, 17:44) на резул...   Sep 27 2013, 06:25
- - DASM   Ура, ошибка появилась ! я могу быть спокоен, д...   Sep 26 2013, 03:51


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 07:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01434 секунд с 7
ELECTRONIX ©2004-2016