LINUX.ORG.RU

C++ шаблоны


0

1

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

С тех пор прошло^W «не мало воды утекло». Перегуглил весь интернет, так и не нашел случая, когда реализацию обязательно надо было писать в заголовочном файле (inline не в счет).

Подскажите, этот случай, пожалуйста. И сохранилась ли сейчас эта потребность?


> когда возился с плюсами наступал на грабли

Это не грабли.

когда реализацию обязательно надо было писать в заголовочном файле


Никогда.

На самом деле речь о том, что в месте использования шаблона должно быть доступно его полное определение. Если шаблон используется в нескольких .cpp файлах, то единственный разумный вариант это разместить определение данного шаблона в .h файле. Но речи о том, что определение шаблона надо ОБЯЗАТЕЛЬНО определять в заголовочном файле не идёт.

archimag ★★★
()

> так и не нашел случая, когда реализацию обязательно надо было писать в заголовочном файле

Ты действительно именно это хотел сказать? Или это про вариант что-то с реализацией включать в хедер?

Реализация шаблонных классов по идее должна быть видна компилятору во время каждого инстанцирования (в большинстве реализаций). Ключевое слово extern должно было по стандартам давать возможность инкапсуляции шаблонов, однако было реализовано по сути в одном компиляторе. И вообще, многие говорили, что это слово не нужно (если мне память не изменяет, тот же Саттер). В 0x будет оно введено, реализовано — хз когда.

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

> Зачем объявление шаблона, если он используется в одном cpp,

писать в хедере?


Незачем. Разве я такое говорил?

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

М.. нет. Просто как-то подумалось, что TC это подразумевал.

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

Вот я и говорю: тогда других вариантов нет, кроме как размещения объявления и реализации в одном или разных включаемых файлах. Ну, во всяком случае, без extern.

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

> export. А разве с этим есть проблемы?

Нет, кроме той, что это не работает.

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

Да, это я что-то жестко протупил.

Тогда и мне разъясните:

1. Много у кого сейчас экспорт шаблонов реализован?

2. «External templates» из 0x не имеет к этому отношения? Если инструкция запрещает инстанцирование в данной единице трансляции, то компилятору достаточно инстанцирования в любой единице, так?

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

На самом деле речь о том, что в месте использования шаблона должно быть доступно его полное определение. Если шаблон используется в нескольких .cpp файлах, то единственный разумный вариант это разместить определение данного шаблона в .h файле. Но речи о том, что определение шаблона надо ОБЯЗАТЕЛЬНО определять в заголовочном файле не идёт.

в процессе гугления натыкался на статью, так говорилось примерно следующее: «не все компиляторы поддерживают разделенное объявление шаблонов» (имелось в виду про разделение кода в .h и .cpp соответственно)

Это не грабли.

Проверил сегодня - работает. Как в gcc, так и в MSVS c++. Да, одно и только одно объявление template должно быть export'ировано по стандарту.

P.S. 15 минут не могу отправить сообщение с соседнего компа, выдает примерно такую ошибку:

Parameter 'mode is not present

Скрипту генерирующему страницу ... бла-бла-бла...

при том, что предыдущее сообщение писалось с него.

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

и да, я подразумеваю шаблоны посложнее min/max

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

Вопрос стоял так: при каких случаях реализацию шаблона надо (обязательно) пихать в заголовочный файл?

Пока 1 ответ:

Если шаблон используется в нескольких .cpp файлах

Хотя разве это не должно обходиться при помощи того же export'а?

irq
() автор топика

Сохранилась, ибо ключевое слово «export» поддерживают не все (точнее почти никто)

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

Вообще, я слабо себе представляю, как можно нормально реализовать экспорт тимплейтов. Куда компилятор будет сохранять заэкспотрированные шаблоны? Или предполагается, что модули, которые используют и экспортируют какие-то шаблоны обязательно должны компилироваться одной пачкой?

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

Если шаблон используется в нескольких .cpp файлах, то единственный разумный вариант это разместить определение данного шаблона в .h файле.

При этом конкретную специализацию шаблона вполне можно размещать в cpp.

Если не вру, то Comodo-вский компайлер позволял размещать определение тоже в cpp-файле (но этот cpp-файл должен быть доступен при компиляции кода, где этот шаблон используется).

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

Вообще, я слабо себе представляю, как можно нормально реализовать экспорт тимплейтов.

Нормально - вообще никак. Шаблоны - это макросистема поверх основного C++, причём макросистема почти на уровне текстуальных подстановок. А это значит, что исходный код шаблона, как ни крути, должен быть доступен при его использовании - ну, может, в чуть-чуть сжатом виде.

Другое дело - дженерики. Их таки можно нормально скомпилить, оставив только заголовок. Но шаблоны C++, по стандарту, не дженерики.

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