Перейти к содержанию
    

Определение оператора класса

работаю в 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");
....

 

но хочется что бы было кошерно.

будут какие-нибудь соображения как сделать лучше?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

....
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).

 

Компилятор выдал предельно точную диагностику - у вас несоответствие типов между декларируемым оператором и закладываемых в него параметров.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Стринговая константа 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");

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И все-таки проверьте - определите параметры вашего оператора так:

void CL_StringLib::Add(const char *);

т.е. в буквальном соответствии со строковой константой. И посмотрите, пропадет ли ошибка в строке

Trip += "mm";

 

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

  typedef __UINT8_T_TYPE__ uint8_t;

и тогда компилятор не сможет догадаться, что char и uint8_t синонимичны. Для С++ вообще характерно считать разными все определения, которые по-разному пишутся. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для С++ вообще характерно считать разными все определения, которые по-разному пишутся. :)

Средство typedef вводит синоним существующего типа, а не новый тип. Вот хотя бы в Бьерн Страуструп. Язык программирования С++. Второе дополненное издание. Смотрите раздел 2.3.9. Хотя это не поможет ТС.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И все-таки проверьте - определите параметры вашего оператора так:

void CL_StringLib::Add(const char *);

т.е. в буквальном соответствии со строковой константой. И посмотрите, пропадет ли ошибка в строке

Trip += "mm";

 

определил так. теперь ошибка пропала в обоих строках.

посмотрел какои у меня char:

post-60535-1380101966_thumb.jpg

так что непонятно почему он не хочет совмещать 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 знак вопроса включает?

да включает, даже если убрать условие, дело это не меняет ((

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Далее выяснилось вот что.
Вы упорно отказываетесь признать, что char, unsigned char и signed char - это три разных типа. Первый предназначен для работы с символами и строками символов, последние два (как и (u)int8_t) - для работы с числами. Вы же упорно пытаетесь функцию, работающую со строками описать как работающую через указатель с числами, получаете в лоб ручкой собственных граблей но продолжаете топтаться по ним.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы упорно отказываетесь признать, что 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 бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Думаю дело тут в 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");

не выдается даже ворнинга!

Т.е. как-то он не всегда расширяет параметры!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не выдается даже ворнинга!

Т.е. как-то он не всегда расширяет параметры!

Попробуйте так:

char const * Tmp = "dfdf";
String.Add(Tmp);

Получите искомую ошибку.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Получите искомую ошибку.

Все теперь ошибка появилось.... я могу быть спокоен :laugh:

Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_t

Cпасибо Всем за обсуждение!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ура, ошибка появилась ! я могу быть спокоен, да здравствует с++ :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наконец все понятно, С++ может по разному интерпретировать строки как массив chаr или же как uint8_t
Нет, он ничего не интерпретирует. Строка - это константный массив char. Этот массив при необходмости неявно приводится к указателю на первый элемент массива. Ваш компилятор С++ почему-то позволяет неявно привести и к указателю на const char и к указателю на const uint8_t. Вероятно потому, что char у вас в настройках компилятора сделан беззнаковым. gcc выдает ошибку и на String.Add("dfdf");

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...