Прямые заголовки для контейнеров STL - PullRequest
8 голосов
/ 17 ноября 2010

Заголовок <iostream> имеет компаньона <iosfwd>, что достаточно, если мне нужны только указатели или ссылки на потоки. Последнее является распространенным сценарием при перегрузке operator<<.

Есть ли такой заголовок для контейнеров STL? Я хочу определить пару функций, которые принимают ссылки на контейнеры STL, и я не хочу включать <vector>, <list>, <set> et. и др. в целом, чтобы у меня были ссылки на эти типы. Существуют ли стандартные, дополнительные или другие решения этой проблемы?

Ответы [ 4 ]

4 голосов
/ 17 ноября 2010

Есть ли такой заголовок для контейнеров STL?

Нет, его нет.

Существуют ли стандартные, дополнительные или другие решения этой проблемы?

Не знаю, о чем я.

Вы должны будете включить эти заголовки.

1 голос
/ 17 ноября 2010

Нет, к сожалению, нет.Стандарт только ввел <iosfwd> для обратной совместимости, чтобы поддерживать код, который был написан для старой библиотеки потоков IO без шаблонов.

0 голосов
/ 17 ноября 2010

С iosfwd это можно сделать, потому что есть только два типа, для которых должны создаваться шаблоны: char и wchar_t. В итоге вы получаете предварительные объявления конкретного экземпляра конкретного типа. С другой стороны, предполагается, что контейнеры STL работают с любым типом, поэтому в заголовках STL нет ничего явного.

0 голосов
/ 17 ноября 2010

На самом деле, почему невозможно иметь прямое объявление класса шаблона?

Если вам остро нужен обходной путь, вы можете использовать что-то вроде этого:

namespace std {

    template<typename T>
    class allocator;

    template<typename T, typename Alloc>
    class vector;
}

Добавить включенную охрану, сохранить как "stdfwd.h" или что-то в этом роде.

Тогда что-то подобное работает без включения <vector>:

void print(std::vector<int, std::allocator<int> >& v);

Работает дляменя с GCC 4.5.В настоящее время я понятия не имею, как сделать прозрачный обходной путь для проблемы, которая не может иметь аргумент по умолчанию (также аргумент шаблона) в объявлении и в определении одновременно, что .. Но это могло бы быть возможно - возможно, кто-то могвзять отсюда?:) Я бы не стал использовать его в производственном коде, я думаю, но выглядит как интересное упражнение.

...