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