LINUX.ORG.RU

Ошибка при компиляции примера из учебника Липмана по C++.


0

0

Привет всем. Решил начать изучение C++ по учебнику Липмана(http://tinyurl.com/7887bj5). Там есть один пример, который объясняет использование #ifdef и #endif:

#include <iostream>
using namespace std;
int main()
{
#ifdef DEBUG
cout << "Начало выполнения main()\n";
#endif
string word;
vector<string> text;
while ( cin >> word )
{
#ifdef DEBUG
cout << "Прочитано слово: " << word << "\n";
#endif
text.push_back(word);
}
}
По какой-то причине он не компилируется со следующими ошибками компилятора:
/home/sergey/C++/cel2far/main.cpp: In function ‘int main()’:
/home/sergey/C++/cel2far/main.cpp:9:1: error: ‘vector’ was not declared in this scope
/home/sergey/C++/cel2far/main.cpp:9:14: error: expected primary-expression before ‘>’ token
/home/sergey/C++/cel2far/main.cpp:9:16: error: ‘text’ was not declared in this scope
Я не могу понять, что не так: вроде бы, скопировал четко из учебника, KDevelop никаких явных ошибок не видит.. Буду благодарен, если поможете мне разобраться.


Ответ на: комментарий от Reset

Мне удобно и наглядно ставить using namespace в начале cpp'шника. Каждый раз набирать std::string, std::vector, std::map и т.д. и т.п. напрягает, да и читать код это мешает, так как вместо сути видишь std:: и прочий мусор.

автодополнение же + а если намешаны stl и, например, boost::fusion?

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

«намешивание» это тема отдельная и такое встречается достаточно редко, зачем в остальных случаях себе жизнь усложнять?

Reset ★★★★★
()
Ответ на: комментарий от dmfd

Еще один оригинальный подход к namespace

// Shorten access to some commonly used names in .cc files.
namespace fbz = ::foo::bar::baz;

KennyMinigun ★★★★★
()
Ответ на: комментарий от andreyu

Вы еще скажите, что буст это хорошо :)

Буст это хорошо, а разве нет?

Dudraug ★★★★★
()
Ответ на: комментарий от Reset

Память в контейнерах надо освобождать так и только если это действительно нужно.

shrink_to_fit же, ну или на худой конец одной строкой, а не четырьмя:

vector<int>().swap(src);

const86 ★★★★★
()
Ответ на: комментарий от Deleted

Нет, но нужно здорово извернуться, реализовав стандартный iostream без string. Не думаю даже, что это возможно.

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

Нет, но нужно здорово извернуться, реализовав стандартный iostream без string. Не думаю даже, что это возможно.

Если в стандарте не написано, то это бабушка надвое вилами по воде...

И кстати мне подумалось: iostream ведь может использовать только конкретные специализации std::basic_string (char для std::string, wchar_t для std::wstring), в этом случае тянуть всю шаблонную магию из <string> не нужно. Или я не прав?

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

с мобильника не удобно весь тред читать :)

если использовать using в функциях, то ок, просто в .cpp - не зря.

seed_stil ★★
()
Ответ на: комментарий от dmfd

Из-за «cout» используется только в режиме отладки, автор может включать в себя #ifdef DEBUG #endif для «#include <iostream>, или кто-то может удалить все дебуги с инклудами,

в этом случае код не будет компилится не-дебуг режиме..

Для этого надо явно указать #include <string>, а не полагаться на транзитивного инклуда.

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