Короче есть такой класс Пытаюсь добавить его в этот класс Вопрос, как эго правильно объявить(если это было сделано не правильно) и как его потом правильно инициализировать На все известные мне способы компилятор ругается например так
cckjYCpJ.ltrans0.ltrans.o*: In function global constructors keyed to 65535_0_BlindController.cpp.o.2468
(.text.startup+0xc8): undefined reference to Queue
Комментарии: 39
Maxim
Объявлять конструктор не пробовал?
Kirill
Для Queue?
Maxim
Точнее, реализовывать Все темплейт-классы крайне хуево работают, когда .h/.cpp отдельно
Kirill
Реализовано в cpp
Maxim
И потому как только класс становится шаблонным, всю логику пишут прямо в .hpp файле Вот не будет так работать
Kirill
Почему и как правильно?
Maxim
Как компилятор, увидев в твоем main.cpp вызов шаблонного конструктора найдет его реализацию? И как компилятор, увидев в queue.cpp реализацию для некого найдет, что в main.cpp она использовалась для конкретного типа? Правильно - писать весь код в хедере, других вариантов я не знаю
Kirill
ясно а зачем тогда h и cpp как отдельные файлы
Maxim
Ну можно, наверное, в cpp инстанциировать очередь для конкретных типов, и не выносить в хедеры
Kirill
(я вообще не за такое разбиение сам c#-овец и там вообще все вместе и все понятно
Maxim
Вообще изначально идея - чтобы уменьшать сложность компиляции
Kirill
А зачем мне инициализация для конкретных типов если у меня вся логика шаблонная(иначе зачем мне шаблонный класс)
Maxim
Вот потому писать весь код в хедере Это единственный способ компилятору инстанциировать его сразу для всех типов, которые он найдет
Kirill
ясно пошёл переписывать)
Maxim
Ты же понимаешь, что шаблоны - это не генерики и код тупо дублируется?
Kirill
Тоесть лучше вообще без cpp обойтись, правильно?
Maxim
Тут - да
Kirill
ну теперь знаю что это разные вещи, знать бы что такое генерики
Maxim
Генерики - это когда один экземпляр кода написан так, что может работать со всеми типами Java и наверное шарп так работают
Kirill
))) ясн Кстати ещё 1 вопрос, можно ли так написать
Maxim
Но вообще я бы не увлекался бы таким стилем программирование под ардуиной (сначала динамически аллоцируемая строка, потом динамически аллоцируемая очередь) и выделил бы статический буфер Вообще каждый раз когда видишь динамическую аллокацию, надо очень долго думать, а действительно ли она нужна и без неё никак
Kirill
ну тут это лучший вариант из тех что пришло в голову Вопрос про return NULL
Maxim
Ну судя по всему - требуется принимать какие-то строковые данные. Почему бы просто не выделить один строковый буфер? Нет, нельзя, не факт, что NULL - это валидное значение для T
Oleksii
Братва а какой у Mechanic флюс BGA самый ништяковый?
Oleksii
ни разу не юзал в руках не держал но хвалят. Первое поддельное кингбо приехало
Maxim
Так что про статические буферы подумай, на 2 килобайтах памяти без MMU маллок - очень большое зло Потому что потом память фрагментируется и песда, может внезапно отказать
Artem
Я про uv-10 видел хорошие отзывы. Сам бга не паяю, но этот флюс понравился очень
Maxim
А иначе получится лютая хрень, которая незаметно десять раз скопирует данные, двадцать раз переаллоцирует, сожрет пару мегабайт памяти и вусмерть фрагментирует хип Вот очередь выше с передачей структур со строками по значению - это первый кандидат на такое поведение Динамический String - второй. Это не JRE с десятью мегабайтами памяти и способностью произвольно двигать указатели
Andy
И Дельфи :)
Maxim
Ой, трупы сами насилуйте, в них я не разбирался. Последний раз, когда я видел дельфи, генериками там и не пахло :D
Anonim
В с# код дженериков тоже дублируется Ты ж назвался шарпистом? Они оттуда изначально и приползли...
Kirill
Не знание некоторых понятий не мешает мне пользоваться самими возможностями.
Anonim
Как же с коллегами по команде общаться, без терминологии??
Kirill
Ну как то получается) Я же не говорю что вообще без терминов
Maxim
Учитывая, насколько эффективный код написан выше - мешает