(C ++), куда мне поместить все мои шаблоны? - PullRequest
1 голос
/ 23 октября 2011

У меня есть разные классы, все расположены в иерархии. Чтобы уменьшить объем кода, я начал создавать шаблонные функции. Базовый класс будет использовать функции шаблона, а некоторые из производных классов также будут использовать те же функции. Куда я должен положить все эти шаблоны, чтобы у меня не возникало неопределенных проблем со ссылками, как у меня? Должен ли я поместить все определения в заголовочный файл, а затем просто включить эти заголовочные файлы в часть .cpp класса, который вызывает функции. это будет работать? На данный момент все мои классы (class.cpp, class.h) компилируются нормально, но во время компоновки все взрывается. Я попытался поместить все шаблоны в пространство имен, а затем включить это пространство имен в реализацию всех моих классов, но это, похоже, не работает. Мой вопрос: как бы вы пошли на создание отдельной сущности, которая просто содержит шаблонные функции, которые любой класс может использовать в своих членах данных?

Ответы [ 2 ]

2 голосов
/ 23 октября 2011

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

Это потому, что компилятор по сути должен генерировать новую функцию для каждого набора параметров шаблона, который используется в файле, который #include содержит заголовок. Если бы функция шаблона была определена в файле .cpp, то все соответствующие версии этих функций должны были бы быть сгенерированы, не зная, как выглядит вызывающий код, а это в принципе невозможно. (Вы получаете дублирующие определения шаблонных функций таким образом, но компоновщик удаляет их и гарантирует, что есть только одна копия, если каждый экземпляр шаблона в конечном двоичном файле.)

1 голос
/ 23 октября 2011

Я вижу многих людей, смущенных этой вещью ... шаблоны не являются типами.Они становятся типами, когда создаются.По этой причине члены шаблонов должны оставаться в том же блоке данных, который вы собираетесь использовать.

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

Теперь, если вам не нравится (и я бы это понял) показ объявлений, определений и реализации в одном файле, вы можете разделить шаблоны в двух разных файлах.

ДляНапример, «list.h» с вашей декларацией и «list.inc» с вашей реализацией.

Чтобы это работало, вы должны включить обе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...