Забавные вещи с SGI STL под GCC 2
Привет всем!
Тут в процессе разработки столкнулся с интересным (на мой взгляд) поведением SGI STL под GCC. Мне нужно было написать свой контейнер, который можно было бы использовать с алгоритмами из <algorithm>. Для этого мне нужно было создать свой итераторный тип для этого контейнера. Я открыл (а что еще?!) Страуструпа, посмотрел как это делается. И вот тут начали происходить интересные вещи - код, написанный точь-в-точь, как завещает Отец С++ не компиллялся. Я попробовал в MSWC ("W" написано _намерено_! :) ) - все работает "на ура".Тогда я полез в стандарт, выяснил, что ГЦЦ неправ. Итак, собственно код, который (IMHO) в STL под GCC не работал выглядит так (только не надо спрашивать "зачем" - этот код не несет смысловой нагрузки, а получился в процессе понимания что, собсно, происходит)
#include <iterator>
typedef std::iterator<std::forward_iterator_tag, int> MyIterator;
Я полез смотреть в заголовки, и там нашел, что определение шаблонного класса iterator окружено #ifdef'ом, и препроцессором выкидывается. Проследив дальше, откуда ноги растут, я увидел (см. файлик stl_config.h, __STL_NO_NAMESPACES), что для GCC версий 2.х.8+ это сделано намерено.
ВНИМАНИЕ, ВОПРОС: Кто-нибудь может объяснить ЗАЧЕМ это сделано, и как с этим жить?!! Вернее, как мне все-таки вернуть шаблон std::iterator<> без правки заголовков?
И еще туда же: в стандарте написано, что STL должен жить в namespace'е std. По-моему, было бы неплохо, если SGI STL это требовал. Если уж так хочется избавиться от std:: всегда можно использовать using, это честнее...
PS Я думаю, что это не очень важно, но на всякий случай:
FreeBSD 4.4-STABLE
gcc version 2.95.3 20010315 (release) [FreeBSD]
Версию STL где посмотреть не знаю (SGI).