Последствия объявления и определения шаблона - PullRequest
11 голосов
/ 02 февраля 2010

Насколько я понимаю, классы шаблонов и функции шаблонов (по большей части) должны быть объявлены и определены в одном и том же заголовочном файле. С этим сказал:

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

  2. Каковы, если таковые имеются, недостатки наличия объявления и определения в одном файле?

  3. Что считается наилучшей практикой, когда дело доходит до объявления и определения шаблона?

Ответы [ 5 ]

12 голосов
/ 02 февраля 2010

Как организовать исходный код шаблона

По сути, у вас есть следующие опции:

  • Сделать определение шаблона видимым для компилятора в момент его создания,
  • Создайте типы, которые вам нужны, явно в отдельном модуле компиляции, чтобы компоновщик мог его найти.
  • Использовать экспорт ключевых слов (если имеется)
2 голосов
/ 02 февраля 2010

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

Вы можете реализовать шаблоны в отдельном файле, а затем включить этот файл из файла .h. Такие как:

templ.h

template<class V> V foo(const V& rhs);
#include "templ.inc"

templ.inc

template<class V> V foo*const V& rhs)
{
// do something...
return val;
}

Мое личное предпочтение - реализовывать шаблоны прямо в файле h, если они не становятся большими, а затем я разбью их на файлы h и inc.

0 голосов
/ 02 февраля 2010

Еще одна проблема - это время компиляции каждый раз, когда вы меняете .h (особенно, если он включен во многих местах)

0 голосов
/ 02 февраля 2010
  1. Не совсем. Определение шаблона должно быть доступно во время компиляции, поскольку шаблоны создаются в зависимости от аргументов шаблона, которые вы им предоставляете. Вот почему они должны быть помещены в заголовки, чтобы компилятор мог иметь код для написания нового экземпляра. Вам очень нужен компилятор с поддержкой ключевого слова export.

  2. Люди могут видеть ваш код, если это для вас недостаток. Это также может быть менее "аккуратно" для некоторых людей, но я не думаю, что это проблема.

0 голосов
/ 02 февраля 2010
  1. Не совсем.Существует ключевое слово export, но большинство компиляторов не поддерживают это.Единственный известный мне мэйнстрим, поддерживающий это, - это компилятор Comeau .
  2. Если ваш шаблон является частью общедоступного API, то вы представляете свой код миру.(большинство людей не считают это проблемой, но некоторые считают, что это зависит от вашего бизнеса).
  3. Поместите их обоих в один заголовочный файл.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...