Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ const_cast для чего и как функционирует http://www.cyberforum.ru/cpp-beginners/thread946080.html
Дошел в свой книге (Дейтел) до const_cast, не могу понять смысла, т.к. там нагромождено не нужно кода в примере, в 5 раза больше самого примера, вот я сделал свой пример: const int var = 10; ...
C++ Скачивание html исходника Здравствуйте) Хочу попросить помощи в следующем: Есть интернет страница с полем ввода данных (номер) после ввода номера на странице (той же) выдается информация о введенном номере Хочу написать... 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 и делать его физическим объектом. Добился того что могу получать точки...
C++ Разработка приложения для symbian на языке c++ Разработка приложения для symbian на языке c++. Приложение-записная книга с простейшим интерфейсом.Проблема заключается в следующем - если в записи встретится номер телефона, то его можно выделить... подробнее

Показать сообщение отдельно
Kastaneda
Jesus loves me
Эксперт С++
4717 / 2921 / 242
Регистрация: 12.12.2009
Сообщений: 7,434
Записей в блоге: 2
Завершенные тесты: 1
31.08.2013, 09:28
Вопрос пришел в ЛС, но отвечу здесь, вдруг кому-то тоже непонятно. Зачем нужны эти 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 минут
немного тут подумал - пример про отрицательный размер не очень красивый, потому что не смог придумать реального примера когда это может быть возможно, но общий смысл должен быть понятен - в стандартной библиотеке будут использоваться именно наши типы, который мы задали своими руками, а не те, которые там прописали разарботчики компилятора.
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.