Другие языки программирования и технологии

С++. Как запихнуть класс-шаблон бинарной кучи в библиотеку?

Хочу запилить библиотеку с кучей. Шоб интерфейс в heap.h, реализацию в libmyheap.a и поехали.
heap.h: http://pastebin.com/RhZbuag3
Проблема в том, что шаблоны не очень-то умеют разделяться в несколько файлов на интерфейс и реализацию: линковщик начинает бушевать на undefined reference и, как я понял, с этим ничего не поделать: особенность языка.
Засовывать реализацию в хедер не буду, ибо неприлично. Ну, по крайней мере, её основную, алгоритмическую часть.
Ребята в интернете кому-то советовали делать шаблон как оболочку над не-шаблонным классом, в котором вся филейная часть, алгоритмы и прочее, прочее. Проблема в том, что я не совсем понимаю, как это можно сделать, не теряя гибкости шаблона. Есть у кого идеи?
Вадим Фирсоф
Вадим Фирсоф
50 628
> Засовывать реализацию в хедер не буду, ибо неприлично.
Сам придумал или тут, на ответах, такую чушь сказали? бОльшая часть std:: и прочих boost:: состоит из шаблонов с реализацией в хедерах.

Вот, для примера, http://libcxx.llvm.org/
$ find include/ -type f | xargs wc -l
123377 total
$ find src/ -type f | xargs wc -l
14040 total
SA
Sergey Abramenko
2 948
Лучший ответ
Шаблон - это, фактически, умный и типобезопасный макрос. Когда ты пишешь
int func(){
printf("abc");
}
то компилятор генерирует бинарный код. Когда ты пишешь
template< typename t > int func(){
printf("abc");
}
то компилятор не генерирует код, но запоминает, что есть такой шаблон, и при вызове
func< int >();
истанциирует шаблон и сгенерирует код для типа int.
Следовательно, тела шаблонов должны находиться в .h-файлах и включаться include-ом, иначе, увы, не пойдет.
Стас Филипенко
Стас Филипенко
84 222
помню колдовал в студенчестве
нужно так эти файлы друг в друга взаимно заинклюдить, чтоб они без повторов "сшились" в один файл
проще конечно сразу в один запихнуть, но если сильно тянет разделить можно и так
Шаблонные классы нельзя скомпилировать в библиотеку, так как чтобы что-то компилировать, нужно иметь код этого чего-то. Код шаблонов генерируется при их инстанциировании, т. е. в месте использования класса. Поэтому единственным вариантом будет header-only реализация, без .a файлов.
Если есть прям непреодолимое желание разбить интерфейс и реализацию, то интерфейс можно описать в .h файле, а реализацию в .inl файле, а потом включить его в конец .h файла.
чтобы прятать шаблон в cpp, нужно инстанцировать шаблон класса (метода) для каждого типа, который будет использоваться, для остальных типов будет undefined reference при линковке.