LINUX.ORG.RU

создание шаблона класса


0

0

Hello!

Пишу контейнерный класс, который в основном будет работаеть со стандартными типами (double, int).

Подумал и решил, применить template <class T> для проектируемого класса. Но когда, я начал разделять интерфейс от реализации, как обычно я делаю (объявления в h-файл, определение в cpp-файл) линкер выдает ошибку, что мои template-функции ему не видны. Помещаю всё в один файл (в h-файл) и всё работает :) Подскажите, please, как разделить класс на два файла?

И стоит ли мне вообще иметь дело с template <class T> для создания шаблонов классов и функций? Может явно создавать классы для соответсвующих стандартных типов?

Thank all :)


> как разделить класс на два файла

Похоже что никак, в cpp файл ты можешь поместить только
специализацию твоих шаблонов для _конкретного_ типа данных.

Если это просто контейнер и ему пофиг что у него внутри,
int или double, то лучше template. Если же там какая-нибудь
математика есть, то все равно придется писать две реализации.

anonymous
()

Не каждый компилятор умеет разделять .h и .cpp файлы для шаблонов, что логично, как ты хочешь скомпилировать шаблон? Он же на то и шаблон чтобы генерироваться во время компиляции. А откуда его скомпилировать для типа my_cool_type если он уже скомпилирован?

Труп пишет что такие фокусы можно делать добавив ключевое слово export к определению шаблона, к сожалению в g++ этот номер у меня не проходит:

bla.c:1: warning: keyword 'export' not implemented, and will be ignored

Да и в любом случае нужна будет перекомпиляция .cpp файла, даже если определение и объявления находятся в разных местах.

Лучше забей и засунь все в .h файл. В /usr/include/... для stl'овских шаблонов все именно так.

dissident ★★
()

Если есть стойкое желание разбить шаблонный класс на два файла то можно сделаьть так: в *.h объявляем, в *.inc пишем определение, и потом инклудим *.inc в *.h. Главное не запутаться в инклудах %)

KIV
()
Ответ на: комментарий от anonymous

>можешь в конце .h файла написать

>#include "file.cpp"

Если конечно в маке-файле нет правил которые пошлют твой file.cpp на компиляцию

KIV
()
Ответ на: комментарий от KIV

Я и не думал, что все так запущенно :)

А на счет того стоит ли вообще использовать шаблоны, что скажите?

Есть соблазн использовать, но знакомый сказал, что имел опыт разбирать шаблоны, говорит чуть голову не сломал :) Он вообще отказался от них.

Вот он меня и навел на мысль по-подробнее к шаблонам присмотреться :)

Шаблоны - задумка не плохая мне так кажется, но реализация не очень :(

Будем разбираться :)

cuba
() автор топика
Ответ на: комментарий от cuba

Шаблоны могут служить несколько иным целям чем генеричные типы. Например ты можешь сделать вычисление каких-то вещей во время компиляции. В твоем проекте (скорее всего он не не будет больше 1-6 тыс. линий кода) тебе не нужны шаблоны. Более того тебе там не нужен C++. Если тебя не заставляют писать на C++ возьми нормальный язык типа питона. Или напиши на C. Все прелести OOP вроде писания плагинов через наследование в твоем проекте скорее всего не будет. В C твой код будет читаем и без плюсанутого спама.

Я вообще еще ни разу не столкнулся с необходимостью использования шаблонов в своих классах. Шаблонных классов из STL да, генерических тип Жабы в коллекциях да, но не своих классов. Да, я ничего больше чем жабоватое графическое тулзо с графиками и иксымылями и статистик на перле для NNTP не писал. И в ближающем будущем не буду.

Ты скорее всего тоже.

Keep It Simple Stupid.

С другой стороны в качестве упражнений можешь писать все что угодно.

dissident ★★
()
Ответ на: комментарий от dissident

2dissedent От суммы и шаблонов не зарекайся :)

cuba
() автор топика
Ответ на: комментарий от dissident

> Все прелести OOP вроде писания плагинов через наследование в твоем проекте скорее всего не будет

Квак-то зря, имхо, народ путает ++ и объекты. В ++ и без объектов немало вкусностей -- нормальное описание функов, описание переменных там, где они нужны, а не непременно в начале функи, ещё чего-то наверняка забыл.

Так что использовать объекты или нет -- личное дело каждого, но писать таки, имхо, лучше уж на ++...

С уважением -- Смоляное Чучелко

anonymous
()
Ответ на: комментарий от anonymous

Квак-то зря, имхо, народ путает ++ и объекты. В ++ и без объектов немало вкусностей -- нормальное описание функов, описание переменных там, где они нужны, а не непременно в начале функи, ещё чего-то наверняка забыл.

-std=gnu99

dissident ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.