Вы не можете безопасно пересылать объявления шаблонов STL, по крайней мере, если вы хотите сделать это переносимым и безопасным. Стандарт четко определяет минимальные требования для каждого элемента STL, но оставляет место для расширений реализации, которые могут добавлять дополнительные параметры шаблона , если они имеют значения по умолчанию . То есть: стандарт гласит, что std :: vector является шаблоном, который принимает как минимум 2 параметра (тип и распределитель), но может иметь любое количество дополнительных аргументов в стандартной совместимой реализации.
Какой смысл не включать строковые и векторные заголовки? Конечно, кто бы ни собирался использовать ваш класс, он, должно быть, уже включил его, поскольку он есть в вашем интерфейсе.
Когда вы спрашиваете о ссылке, чтобы решить, когда включать и когда пересылать объявление, мой совет будет таким: включите все, что является частью вашего интерфейса, перешлите объявление внутренней информации.
Здесь есть и другие проблемы, связанные с простой производительностью компиляции. Если вы нажимаете на включение типа, который находится в вашем общедоступном (или защищенном) интерфейсе вне заголовка, вы будете создавать зависимости в порядке включений. Пользователи должны знать, что они должны включать строку , прежде чем включать ваш заголовок, поэтому вы даете им еще одну вещь, о которой нужно беспокоиться.
Что следует включить в файл реализации: подробности реализации, средства ведения журнала, элементы, которые не влияют на интерфейс (коннекторы базы данных, заголовки файлов), детали внутренней реализации (то есть использование алгоритмов STL для вашей реализации не влияет на вашу реализацию интерфейс, функторы, которые создаются для простого назначения, утилиты ...)