Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Определение оператора класса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
MK2
работаю в 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
Цитата(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).

Компилятор выдал предельно точную диагностику - у вас несоответствие типов между декларируемым оператором и закладываемых в него параметров.
MK2
Цитата(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");

там немного более сложное условие, но ни в том ни другом виде это не влияет на ошибку.

Xenia
И все-таки проверьте - определите параметры вашего оператора так:
Код
void CL_StringLib::Add(const char *);

т.е. в буквальном соответствии со строковой константой. И посмотрите, пропадет ли ошибка в строке
Код
Trip += "mm";


Дело в том, что в хидере stdint.h тип uint8_t может быть определен не как unsigned char, а каким-нибудь вычурным способом, вроде:
Код
  typedef __UINT8_T_TYPE__ uint8_t;

и тогда компилятор не сможет догадаться, что char и uint8_t синонимичны. Для С++ вообще характерно считать разными все определения, которые по-разному пишутся. sm.gif
Tiro
Цитата(Xenia @ Sep 25 2013, 00:17) *
Для С++ вообще характерно считать разными все определения, которые по-разному пишутся. sm.gif

Средство typedef вводит синоним существующего типа, а не новый тип. Вот хотя бы в Бьерн Страуструп. Язык программирования С++. Второе дополненное издание. Смотрите раздел 2.3.9. Хотя это не поможет ТС.
A. Fig Lee
Speed_units знак вопроса включает?
MK2
Цитата(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 знак вопроса включает?

да включает, даже если убрать условие, дело это не меняет ((
Сергей Борщ
QUOTE (MK2 @ Sep 25 2013, 11:51) *
Далее выяснилось вот что.
Вы упорно отказываетесь признать, что char, unsigned char и signed char - это три разных типа. Первый предназначен для работы с символами и строками символов, последние два (как и (u)int8_t) - для работы с числами. Вы же упорно пытаетесь функцию, работающую со строками описать как работающую через указатель с числами, получаете в лоб ручкой собственных граблей но продолжаете топтаться по ним.
MK2
Цитата(Сергей Борщ @ Sep 25 2013, 15:04) *
Вы упорно отказываетесь признать, что char, unsigned char и signed char - это три разных типа. Первый предназначен для работы с символами и строками символов, последние два (как и (u)int8_t) - для работы с числами. Вы же упорно пытаетесь функцию, работающую со строками описать как работающую через указатель с числами, получаете в лоб ручкой собственных граблей но продолжаете топтаться по ним.

я не отрицаю что это три разных типа, мне непонятно почему ф-ция объявленная как void Add(const uint8_t * point) не выдает даже варнингов в строчках типа Trip.Add("Rm");
а при применение оператора вызывает ошибку!
MALLOY2
Думаю дело тут в promoution. Где то в стандарте расписано. Дело в том что в С++ можно перегружать функции, фактически компилятор ищет функцию которая может подойти под ваши параметры, и если ее нету он может расширить (promoution) параметр по определенным правилам. Но с перегрузкой операторов такое не прокатит !!!!

P.S. uint8_t != char, uint8_t != signed char, uint8_t != unsigned char. Т.к. char может быть и 16 бит (как у TMS320C55xx) и он может иметь значение 10000, а uint8_t хоть и будет 16 бит в памяти занимать на такой платформе от не сможет принять такое значение, так как компилятор будет маску на него накладывать и в этой переменно всегда будет число в диапазоне 8 бит.
MK2
Цитата(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");

не выдается даже ворнинга!
Т.е. как-то он не всегда расширяет параметры!
Сергей Борщ
QUOTE (MK2 @ Sep 25 2013, 17:29) *
не выдается даже ворнинга!
Т.е. как-то он не всегда расширяет параметры!
Попробуйте так:
CODE
char const * Tmp = "dfdf";
String.Add(Tmp);
Получите искомую ошибку.
MK2
Цитата(Сергей Борщ @ Sep 25 2013, 19:16) *
Получите искомую ошибку.

Все теперь ошибка появилось.... я могу быть спокоен laugh.gif
Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_t
Cпасибо Всем за обсуждение!
DASM
Ура, ошибка появилась ! я могу быть спокоен, да здравствует с++ sm.gif
Сергей Борщ
QUOTE (MK2 @ Sep 25 2013, 21:36) *
Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_t
Нет, он ничего не интерпретирует. Строка - это константный массив char. Этот массив при необходмости неявно приводится к указателю на первый элемент массива. Ваш компилятор С++ почему-то позволяет неявно привести и к указателю на const char и к указателю на const uint8_t. Вероятно потому, что char у вас в настройках компилятора сделан беззнаковым. gcc выдает ошибку и на String.Add("dfdf");
MK2
Цитата(Сергей Борщ @ Sep 26 2013, 13:11) *
Вероятно потому, что char у вас в настройках компилятора сделан беззнаковым. gcc выдает ошибку и на String.Add("dfdf");

ради интереса выставил char знаковымНажмите для просмотра прикрепленного файла
на результаты это никак не отразилось
Сергей Борщ
QUOTE (MK2 @ Sep 26 2013, 17:44) *
на результаты это никак не отразилось
Тогда, вероятно, бага. Попробуйте написать в техподдержку. Должен выдавать ошибку.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.