Глава 15 «Стандартная библиотека шаблонов (STL)»,
раздел «Введение в STL» / подраздел «Контейнеры» / подподраздел «Адаптеры контейнеров»,
цитата (стр.687):
Для практического применения этих классов необходимо использовать как бы шаблон в шаблоне. Например, пусть имеется объект типа стек, содержащий значения int
, порожденный классом «очередь с двусторонним доступом» (deque
):
stack< deque<int> > aStak;
Деталь, на которую стоит обратить внимание при описании этого формата, это пробелы, которые необходимо ставить между двумя закрывающими угловыми скобками. Помните об этом, потому что такое выражение
stack<deque<int>> aStak;
приведет к синтаксической ошибке — компилятор интерпретирует >>
как оператор.
Я проверил оригинал на английском, там написано то же самое (перевод на русский, конечно, не фонтан, но более-менее смысл передает).
На самом деле, современные компиляторы должны принять без ошибок оба указанных выше варианта. Конечно, если они соблюдают стандарт языка C++. Как пишут в интернетах, соответствующие изменения были внесены в стандарт, начиная с C++11. Конкретно следует обратить внимание в этом стандарте на параграф 14.2 «Names of template specializations» (часть 3). Текст стандарта в формате PDF можно найти на сайте www.open-std.org:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3690.pdf
Я проверил в среде «Visual Studio Community 2017»: оба варианта работают. В стандартных заголовочных файлах, кстати, там, где я смотрел, пробел между двумя закрывающими угловыми скобками проставлен. Видимо, для лучшей читабельности кода, либо чтобы с этими файлами смогли работать компиляторы старых версий.
Лафоре об этом, конечно, знать не мог, так как учебник вышел в 2001 году.
Обсуждение на портале Stackoverflow.com:
https://stackoverflow.com/questions/15785496/c-templates-angle-brackets-pitfall-what-is-the-c11-fix