Гость Опубликовано 19 февраля, 2003 Жалоба Поделиться Опубликовано 19 февраля, 2003 При любой попытке использовать STL (Стандартная Библиотека Шаблонов) в gcc (версии 2.96 и 3.2) последний выдает множество ошибок при компиляции проекта. Что нужно сделать чтобы успешно собрать самый простейший проект (какие библиотеки указывать, или еще что...). Пример: #include #include using namespace std; int main() { printf("\nUsing string from STL\n"); string str("Simple String"); return 0; } Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 февраля, 2003 Жалоба Поделиться Опубликовано 20 февраля, 2003 Доброго времени суток 1) Класс string принадлежит не STL a стандартной библиотеке С++ 2) Лучше не использовать stdio C библиотеку 3) Если использовать стандартную библиотеку С в С++ программе то она должна быть включена как #include <"+"c" + header_name_without_h + ">" в нашем случае как #include или #include 4)Если gcc/g++ установлен нормально никаких проблем при компиляции быть не должно А что дает "g++ -v"?и вообще какие ошибки ? Успехов --- sas Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 февраля, 2003 Жалоба Поделиться Опубликовано 20 февраля, 2003 Еще было бы полезно получить результаты следующей команды : gcc -print-search-dirs С уважением --- sas Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 февраля, 2003 Жалоба Поделиться Опубликовано 20 февраля, 2003 Уважаемый sas, класс string всегда принадлежал STL, а не стандартной библиотеке C++. Включение строк #include как я и предполагал ничего не изменило (компилятор просто выдает ошибку 'string' undeclared). g++ -v выдает: gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110) Что делать дальше не знаю... Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 февраля, 2003 Жалоба Поделиться Опубликовано 20 февраля, 2003 Рекомендация очень простая: поставить нормальную версию gcc, а не редхатовскую поделку. На gcc 3.2.2 всё замечательно работает. [~]$g++ zz.cpp [~]$./a.out Using string from STL [~]$gcc -v Reading specs from /usr/bin/../lib/gcc-lib/i686-pc-linux-gnu/3.2.2/specs Configured with: ../gcc-3.2.2/configure --prefix=/usr/upd/gcc-3.2.2 --enable-shared --with-gnu-as --with-gnu-ld --enable-threads --disable-nls --with-system-zlib Thread model: posix gcc version 3.2.2 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 февраля, 2003 Жалоба Поделиться Опубликовано 20 февраля, 2003 1) -------------------------------------------------------- По поводу string пойдем на сайт автора языка и посмотрим определение стандартной библиотеки языка С++ http://www.research.att.com/~bs/glossary.html standard library - The library defined in the C++ standard. Contains strings, stream I/O, a framework of containers and algorithms, support for numerical computation, support for internationalization, the C standard library, and some language support facilities. See also: complex, valarray, locale. TC++PL 16-22, D, Кроме того там же на сайте можно найти главу из последней книги Строутструпа : A Tour of the Standard Library смотрим пункт 3.10 Standard Library Facilities где он четко делит библиотеку на составляющие: http://www.research.att.com/~bs/3rd.html ... [3] Strings and I/O streams with support for international character set and internationalization [4]A framework of containers (such as vector, list and map) and algorithms using container... ... И через параграф ниже объясняет что этот "framework" и называется STL (Степанов 1994) (перевод не буквальный) Тоже самое видим и у Денни Калева (один из членов комитета по стандартизации С++ если я не ошибаюсь (не уверен на 100%)) в его книге: ANSI/ISO C++ Professional Programmer's Handbook http://documentation.captis.com/files/c++/handbook/ch02/ch02.htm << The Standard Template Library According to Bjarne Stroustrup, the most important change in C++ since 1991 is not a language change; it is the addition of the standard library. The Standard Template Library, or STL, comprises a substantial part of the Standard Library. STL is collection of generic containers -- such as vector, list, and stack -- and a rich collection of generic algorithms for sorting, finding, merging, and transforming these containers. Chapter 10, "STL and Generic Programming," is dedicated to STL. Internationalization and Localization The current C++ Standard is an international Standard approved by ISO. To qualify as such, Standard C++ has been fully internationalized. Internationalization consists of several modifications and extensions. These include the addition of the keyword wchar_t (wchar_t was already defined in ISO C as a typedef but it wasn't a reserved keyword). In addition, the standard stream and string classes have been templatized to support both narrow and wide characters. Finally, the library defines template classes and declares functions that encapsulate and manipulate locale-related information such as monetary, numeric, and time conventions. The locale feature sets are encapsulated in classes (or facets) that the users can extend. >> В параграфе выше прямо говорится как и почему классы I/O stream и string были определены (и даже переопределены в параметризованные). Из этого вытекает что хотя basic_string и иже с ним string; wstring... и являются параметризованными контейнерами они к STL не относятся. Время выхода книги 1999 Кроме того советую посмотреть на http://citeseer.nj.nec.com/correct/334903 или http://www.cs.rpi.edu/~musser/doc.ps Это STL (Степанов - Ли) в 1994/95 до включения в стандарт. Тк string - контейнер то прошу обратить внимание на перечень контейнеров в оглавлении. String сюда не входит Если нужен перевод то дайте знать. Заключение : String (с маленькой буквы) никогда в STL не входил. Хотя SGI реализация его и включает 2 ------------------------------------------------------------ Кроме того конечно включение cstdio не смогло бы помочь . Это вопрос соответствия современному стандарту языка (кстати многие компиляторы более старых версии не имеют этих файлов и тогда надо использовать stdio.h) 3 ------------------------------------------------------------- А где же результаты gcc -print-search-dirs ? Например у меня на RH 73 нет C++ только С и результаты следующие: install: /usr/lib/gcc-lib/i386-redhat-linux/2.96/ programs: =/usr/lib/gcc-lib/i386-redhat-linux/2.96/:/usr/lib/gcc-lib/i386-redhat -linux/2.96/:/usr/lib/gcc-lib/i386-redhat-linux/:/usr/lib/gcc/i386-redhat-linux/ 2.96/:/usr/lib/gcc/i386-redhat-linux/:/usr/lib/gcc-lib/i386-redhat-linux/2.96/.. /../../../i386-redhat-linux/bin/i386-redhat-linux/2.96/:/usr/lib/gcc-lib/i386-re dhat-linux/2.96/../../../../i386-redhat-linux/bin/ libraries: =/usr/lib/gcc-lib/i386-redhat-linux/2.96/:/usr/lib/gcc/i386-redhat-li nux/2.96/:/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../../i386-redhat-linux/ lib/i386-redhat-linux/2.96/:/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../../ i386-redhat-linux/lib/:/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../i386-red hat-linux/2.96/:/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../:/lib/i386-redh at-linux/2.96/:/lib/:/usr/lib/i386-redhat-linux/2.96/:/usr/lib/ ============================================= Успехов --- sas Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 20 февраля, 2003 Жалоба Поделиться Опубликовано 20 февраля, 2003 Забыл сказать, что по вашему ответу похоже на то что или С++ не установлен или заголовочные файлы/библиотеки находятся в месте о котором компилятор не знает. Именно поэтому я и спрашиваю о -print-search-dirs Надо в системе найти например iostream header и сравнить с путем о котором знает компилятор Если этот файл есть то надо добавить -I опцию при его вызове (может быть и -L) Если файла в системе нет то надо просто переустановить rpm с С++ find / -type f -name iostream2>/dev/null |less Успехов --- sas Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.