Хочу запилить библиотеку с кучей. Шоб интерфейс в heap.h, реализацию в libmyheap.a и поехали.
heap.h: http://pastebin.com/RhZbuag3
Проблема в том, что шаблоны не очень-то умеют разделяться в несколько файлов на интерфейс и реализацию: линковщик начинает бушевать на undefined reference и, как я понял, с этим ничего не поделать: особенность языка.
Засовывать реализацию в хедер не буду, ибо неприлично. Ну, по крайней мере, её основную, алгоритмическую часть.
Ребята в интернете кому-то советовали делать шаблон как оболочку над не-шаблонным классом, в котором вся филейная часть, алгоритмы и прочее, прочее. Проблема в том, что я не совсем понимаю, как это можно сделать, не теряя гибкости шаблона. Есть у кого идеи?
Другие языки программирования и технологии
С++. Как запихнуть класс-шаблон бинарной кучи в библиотеку?
> Засовывать реализацию в хедер не буду, ибо неприлично.
Сам придумал или тут, на ответах, такую чушь сказали? бОльшая часть std:: и прочих boost:: состоит из шаблонов с реализацией в хедерах.
Вот, для примера, http://libcxx.llvm.org/
$ find include/ -type f | xargs wc -l
123377 total
$ find src/ -type f | xargs wc -l
14040 total
Сам придумал или тут, на ответах, такую чушь сказали? бОльшая часть std:: и прочих boost:: состоит из шаблонов с реализацией в хедерах.
Вот, для примера, http://libcxx.llvm.org/
$ find include/ -type f | xargs wc -l
123377 total
$ find src/ -type f | xargs wc -l
14040 total
Шаблон - это, фактически, умный и типобезопасный макрос. Когда ты пишешь
int func(){
printf("abc");
}
то компилятор генерирует бинарный код. Когда ты пишешь
template< typename t > int func(){
printf("abc");
}
то компилятор не генерирует код, но запоминает, что есть такой шаблон, и при вызове
func< int >();
истанциирует шаблон и сгенерирует код для типа int.
Следовательно, тела шаблонов должны находиться в .h-файлах и включаться include-ом, иначе, увы, не пойдет.
int func(){
printf("abc");
}
то компилятор генерирует бинарный код. Когда ты пишешь
template< typename t > int func(){
printf("abc");
}
то компилятор не генерирует код, но запоминает, что есть такой шаблон, и при вызове
func< int >();
истанциирует шаблон и сгенерирует код для типа int.
Следовательно, тела шаблонов должны находиться в .h-файлах и включаться include-ом, иначе, увы, не пойдет.
помню колдовал в студенчестве
нужно так эти файлы друг в друга взаимно заинклюдить, чтоб они без повторов "сшились" в один файл
проще конечно сразу в один запихнуть, но если сильно тянет разделить можно и так
нужно так эти файлы друг в друга взаимно заинклюдить, чтоб они без повторов "сшились" в один файл
проще конечно сразу в один запихнуть, но если сильно тянет разделить можно и так
Шаблонные классы нельзя скомпилировать в библиотеку, так как чтобы что-то компилировать, нужно иметь код этого чего-то. Код шаблонов генерируется при их инстанциировании, т. е. в месте использования класса. Поэтому единственным вариантом будет header-only реализация, без .a файлов.
Если есть прям непреодолимое желание разбить интерфейс и реализацию, то интерфейс можно описать в .h файле, а реализацию в .inl файле, а потом включить его в конец .h файла.
Если есть прям непреодолимое желание разбить интерфейс и реализацию, то интерфейс можно описать в .h файле, а реализацию в .inl файле, а потом включить его в конец .h файла.
чтобы прятать шаблон в cpp, нужно инстанцировать шаблон класса (метода) для каждого типа, который будет использоваться, для остальных типов будет undefined reference при линковке.
Похожие вопросы
- Алгоритмы стандартной библиотеки шаблонов. Вектора в C++.
- с++. нужно для списков из библиотеки шаблонов перегрузить оператор==. делаю как в классах - хрен. подскажите, что-нибудь
- Вопрос по основам машинного кода и бинарного кода. Как это работает в своей основе?
- как устроен бинарный файл
- Бинарные деревья в алгоритме поиска слов
- ПОМОГИТЕ ПОСТАВИТЬ ШАБЛОН НА Ucoz
- Вопрос по бесплатным шаблонам сайтов
- Нужно оценить Flash шаблон?
- Оцените шаблон и юзабилити такого сайта на движке wordpress
- Как установить шаблон jooomla?