Перейти к содержанию

Проблема с STL


Гость

Рекомендуемые сообщения

При любой попытке использовать 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;

}

Ссылка на комментарий
Поделиться на другие сайты

Доброго времени суток

1) Класс string принадлежит не STL a стандартной библиотеке С++

2) Лучше не использовать stdio C библиотеку

3) Если использовать стандартную библиотеку С в С++ программе то она должна быть включена как

#include <"+"c" + header_name_without_h + ">"

в нашем случае как

#include или

#include

4)Если gcc/g++ установлен нормально никаких проблем при компиляции быть не должно

А что дает "g++ -v"?и вообще какие ошибки ?

Успехов

--- sas

Ссылка на комментарий
Поделиться на другие сайты

Уважаемый sas, класс string всегда принадлежал STL, а не стандартной

библиотеке C++. Включение строк #include как я и предполагал

ничего не изменило (компилятор просто выдает ошибку 'string' undeclared).

g++ -v выдает: gcc version 2.96 20000731 (Red Hat Linux 7.3 2.96-110)

Что делать дальше не знаю...

Ссылка на комментарий
Поделиться на другие сайты

Рекомендация очень простая: поставить нормальную версию 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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Забыл сказать, что по вашему ответу похоже на то что или С++ не установлен или заголовочные файлы/библиотеки находятся в месте о котором компилятор не знает. Именно поэтому я и спрашиваю о -print-search-dirs

Надо в системе найти например iostream header и сравнить с путем о котором знает компилятор Если этот файл есть то надо добавить -I опцию при его вызове (может быть и -L)

Если файла в системе нет то надо просто переустановить rpm с С++

find / -type f -name iostream2>/dev/null |less

Успехов

--- sas

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...