razrab83 21 27 января, 2021 Опубликовано 27 января, 2021 (изменено) · Жалоба Вот код 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, попробуйте собрать в плюсах, соберётся? Изменено 27 января, 2021 пользователем razrab83 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MrBearManul 0 27 января, 2021 Опубликовано 27 января, 2021 · Жалоба Простите, а в чём ваш вопрос? Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 27 января, 2021 Опубликовано 27 января, 2021 · Жалоба 2 минуты назад, MrBearManul сказал: Простите, а в чём ваш вопрос? дополнил. нечайно опубликовал недописав Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 131 27 января, 2021 Опубликовано 27 января, 2021 · Жалоба 2 часа назад, razrab83 сказал: Вот код ... собирается. Ошибка, собственно, здесь - строковые литералы не могут быть аргументами списка параметров шаблона: Остальное, полагаю, лишь следствие этой ошибки, которое приводит к недопустимым действиям внутри самого компилятора (Tool Internal Error). Вы можете отправить сообщение об ошибке производителю компилятора (вы ведь его покупали), но даже после испраления ошибки вы не сможете использовать строковый литерал как параметр шаблона. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 27 января, 2021 Опубликовано 27 января, 2021 · Жалоба Всё понятно, спасибо. Весь текст убрал в массив указателей на строки, в шаблон передаю индекс строки в этом массиве. Заработало. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 131 27 января, 2021 Опубликовано 27 января, 2021 · Жалоба Тогда логично объявить перечисление (enum) с читаемыми именами индексов и в шаблон передавать именно его. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
razrab83 21 27 января, 2021 Опубликовано 27 января, 2021 (изменено) · Жалоба 39 минут назад, Сергей Борщ сказал: Тогда логично объявить перечисление (enum) с читаемыми именами индексов и в шаблон передавать именно его. так и сделал ps. если бы иар сразу ругнулся на текст в аргументах шаблона.... то переделал бы на индексы... а то ведь он собрал код и код работал, и работал правильно. кучу вызовов шаблона с разным текстом сделал - собиралось и работало. Даже дебажил шаблоны (в иаре они просто дебажатся, хотя в инете негодуют по поводу дебага шаблонов). Сделал 2 вызова с текстом "KI=" и "KD=" - перестало собираться ((. Изменено 27 января, 2021 пользователем razrab83 Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться