LINUX.ORG.RU

Забавные вещи с SGI STL под GCC 2


0

0

Привет всем!

Тут в процессе разработки столкнулся с интересным (на мой взгляд) поведением 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).


Да, я ща должен уйти, прошу тех, кому не смогу ответить сразу, подождать до понедельника.

bison
() автор топика

А что говорит gcc при компиляции? Насчет namespace std. Правда, это странно. Но в STL, что идет с gcc3.0.3, с этим все нормально... Я могу ошибаться, но по-моему, в еще даже не очень старых версия gcc не поддерживались namespace...

JekLove
()
Ответ на: комментарий от JekLove

Ну соответственно и ругается - шаблон iterator<>- то не определен... То есть либо syntax error (если std:: не указывать явно) либо честно рассказывает что в namespace std:: не определен шаблон iterator. Еще разок, с компиллятором все в порядке, вопрос с (конфигурацией?) SGI STL..

bison
() автор топика

закомментировано оно потому, что до 2.95 по-моему не было поддержки пространств имен, gcc --version у тебя что говорит?

anonymous
()
Ответ на: комментарий от anonymous

gcc version 2.95.3 20010315 (release) [FreeBSD], я уже написал в первом сообщении :)

Да нет, namespaces в этой версии поддерживаются в полный рост.

bison
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.