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

Шаблоны, IAR

Вот код
 

template<const char *T>
bool tunePwmRHelper()
{
      if(*T == 0)
        return true;
    return false;
}

bool (*looo)();

void asd()
{
      looo = tunePwmRHelper<"asd=">;
      bool (*looo2)() = tunePwmRHelper<"asd1=">;
    bool s = looo();
}

собирается.

меняем текст asd на нужный
 

template<const char *T>
bool tunePwmRHelper()
{
      if(*T == 0)
        return true;
    return false;
}

bool (*looo)();

void asd()
{
      looo = tunePwmRHelper<"KD=">;
      bool (*looo2)() = tunePwmRHelper<"KI=">;
    bool s = looo();
}

не собирается, ошибка

   IAR ANSI C/C++ Compiler V8.50.4.261/W32 for ARM
   Copyright 1999-2020 IAR Systems AB.
    
Warning[Pe009]: nested comment is not allowed C:\work\workspace\menu\menu_pwm_settings_306_3_081_32_.cpp 61
Warning[Pe177]: variable "looo2" was declared but never referenced C:\work\workspace\menu\menu_pwm_settings_306_3_081_32_.cpp 93
Tool Internal Error:
Internal Error: [CoreUtil/General]: OgModuleLabels -- label _Z14tunePwmRHelperILA4_KcEEbv already defined
Internal Error: [CoreUtil/General]: OgModuleLabels -- label _Z14tunePwmRHelperILA4_KcEEbv already defined
Error while running C/C++ Compiler

Если закоментировать tunePwmRHelper<"KI=">, то соберется.... если заменить "KD=" на "asd" - соберёться. Но если 2 раза вызвать шаблонную функцию и передать ей разный текст, и текст будет начинаться с буквы "К", то ошибка - "label  already defined".

Глюк компилятора? У кого иар посвежее 8.5, попробуйте собрать в плюсах, соберётся?

 

 

 

Изменено пользователем razrab83

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


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

2 минуты назад, MrBearManul сказал:

Простите, а в чём ваш вопрос?

дополнил. нечайно опубликовал недописав

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


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

2 часа назад, razrab83 сказал:

Вот код
...

собирается.

Ошибка, собственно, здесь - строковые литералы не могут быть аргументами списка параметров шаблона:

image.png.d1852fcfda1add4fc30516fe0d5f3fb2.png

Остальное, полагаю, лишь следствие этой ошибки, которое приводит к недопустимым действиям внутри самого компилятора (Tool Internal Error). Вы можете отправить сообщение об ошибке производителю компилятора (вы ведь его покупали), но даже после испраления ошибки вы не сможете использовать строковый литерал как параметр шаблона.

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


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

Всё понятно, спасибо. Весь текст убрал в массив указателей на строки, в шаблон передаю индекс строки в этом массиве. Заработало.

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


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

Тогда логично объявить перечисление (enum) с читаемыми именами индексов и в шаблон передавать именно его.

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


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

39 минут назад, Сергей Борщ сказал:

Тогда логично объявить перечисление (enum) с читаемыми именами индексов и в шаблон передавать именно его.

так и сделал

 

 

ps. если бы иар сразу ругнулся на текст в аргументах шаблона.... то переделал бы на индексы...  а то ведь он собрал код и код работал, и работал правильно. кучу вызовов шаблона с разным текстом сделал - собиралось и работало. Даже дебажил шаблоны (в иаре они просто дебажатся, хотя в инете негодуют по поводу дебага шаблонов). Сделал 2 вызова с текстом "KI=" и "KD=" - перестало собираться ((.

Изменено пользователем razrab83

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...