Форум программистов, компьютерный форум CyberForum.ru

Ошибка компиляции при включении #include <vector> - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ const_cast для чего и как функционирует http://www.cyberforum.ru/cpp-beginners/thread946080.html
Дошел в свой книге (Дейтел) до const_cast, не могу понять смысла, т.к. там нагромождено не нужно кода в примере, в 5 раза больше самого примера, вот я сделал свой пример: const int var = 10; int *ptr = const_cast<int *>(&var); cout << "*ptr: " << *ptr << " ptr: " << ptr << endl; // 10 cout << "var: " << var << " &var: " << &var << endl; // 10 *ptr = 15;
C++ Скачивание html исходника Здравствуйте) Хочу попросить помощи в следующем: Есть интернет страница с полем ввода данных (номер) после ввода номера на странице (той же) выдается информация о введенном номере Хочу написать программу которая методом перебора будет сохранять информацию о номерах перебор и поиск в исходнике, думаю, осилю сам Хочу лишь знать как сохранять исходники через XCode Пробовал подключать Asio (оно... http://www.cyberforum.ru/cpp-beginners/thread946078.html
C++ NDEBUG и DEBUG
зачем нужны константы NDEBUG и DEBUG?? спасибо.
Исходник чата C++
Всем приветик!:) Хочу задать вам один глупый вопросик...:) Есть у кого нибудь исходник какого нибудь чата?:) Что то искала, ничего подходящего не нашла...:( В общем, сейчас попробую описать поподробней, как я вижу то, что ищу:) Есть программка. Такая же программка есть ещё у нескольких человек. Я пишу что нибудь и нажимаю кнопку "Отправить" и моё сообщение появляется у всех людей, у кого...
C++ c++ box2d и opencv http://www.cyberforum.ru/cpp-beginners/thread946046.html
Работаю на Xcode с openframework, конкретнее с библиотеками box2d и opencv. Задача захватывать контур с помощью opencv и делать его физическим объектом. Добился того что могу получать точки определенного контура так: ofPoint contours; vector <ofPoint> simpleCountour; for(int i = 0; i < contourFinder.nBlobs; i++) { simpleCountour = contourFinder.blobs.at(i).pts; contours =...
C++ Разработка приложения для symbian на языке c++ Разработка приложения для symbian на языке c++. Приложение-записная книга с простейшим интерфейсом.Проблема заключается в следующем - если в записи встретится номер телефона, то его можно выделить ,передать в строку набора номера и позвонить. Нужен код именно последней функции. подробнее

Показать сообщение отдельно
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
31.08.2013, 09:28     Ошибка компиляции при включении #include <vector>
Вопрос пришел в ЛС, но отвечу здесь, вдруг кому-то тоже непонятно. Зачем нужны эти typedef'ы как они используются?
Тривиальный пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
template <class T>
class Vector
{
public:
    typedef T value_type;
 
    void push_back(T) {}
};
 
template <class Container>
void func (Container container)
{
    typename Container::value_type val = 0;
    container.push_back(val);
}
 
int main()
{
    Vector<int> vec;
 
    func(vec);
 
    return 0;
}
Есть некий Vector и есть функция func() внутри которой нужно создать объект типа, который хранит этот вектор (грубо говоря нам нужно узнать тип T для вектора). При таком параметере шаблона это сделать невозможно (можно переписать параметр шаблона по другому, тогда компилятор сам определит тип Т, но это другой вопрос). Чтоб сделать это возможным в векоторе определяется typedef на шаблонный T, который называется value_type. Теперь мы можем в любом месте создать объект типа Т, на зная что это за тип, при помощи value_type.
Надеюсь этот пример дает понимание как эти typedef'ы используются на практике.

Теперь про наши typedef'ы, например
C++
1
typedef size_t size_type;
допустим мы используем свой вектор со стандартными функциями и какой-то их этих функций понадобился размер нашего вектора. Казалось бы разработчики STL могли не парится и написать так
C++
1
int vec_size = vec.size();
Но что если мы использовали для своего вектора тип size_t, который хранит размер вектора? Тип size_t является более "широким" типом по сравнению с int'ом и если размер нашего векотора превысил INT_MAX (но свободно помещается в size_t), то в коде выше результат будет не верный (vec_size будет отрицательным). Кто-то подумает: "Хорошо, тогда разработчики STL могли сделать так"
C++
1
size_t vec_size = vec.size();
Да, могли, но что если мы вызвали эту функцию не для контейнера, а просто для какого-то своего класса, в котором размер может быть отрицательным (мало ли для чего это понадобится)? Тогда результат опять будет не верным, т.к. size_t беззнаковый. Поэтому в STL испольуется такая запись
C++
1
typename  OurClass::size_type size = ourObject.size();
где OurCLass получен через аргумент шаблона, а ourObject это переданный нами объект. Т.е. ожидается, что в нашем классе определен typedef для size_type (иначе мы увидим ошибку как в первом посте) и стандартная библиотека будет использовать для размера нашего контейнера правильный тип данных, заданный программистом.

Все необходимые typedef'ы определены в стандарте языка и лучше их всегда определять, даже если некоторые из них могут никогда не понадобится.

Надеюсь понятно объснил, если остались вопросы - пишите.

Добавлено через 8 минут
немного тут подумал - пример про отрицательный размер не очень красивый, потому что не смог придумать реального примера когда это может быть возможно, но общий смысл должен быть понятен - в стандартной библиотеке будут использоваться именно наши типы, который мы задали своими руками, а не те, которые там прописали разарботчики компилятора.
 
Текущее время: 17:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru