3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32
|
||||||
1 | ||||||
Шаблоны и вложенные классы - синтаксис23.01.2014, 22:55. Показов 7841. Ответов 27
Метки нет (Все метки)
Пишу класс бинарного красно черного дерева, решил сделать структуру узла в нем вложенной, но столкнулся с проблемой непонимания синтаксиса и борьбы с языком
идея примерно такова
0
|
23.01.2014, 22:55 | |
Ответы с готовыми решениями:
27
Вложенные классы. Что за синтаксис такой? Вложенные классы вложенные классы Вложенные классы |
Ушел с форума
|
||||||
23.01.2014, 23:36 | 2 | |||||
1
|
3 / 3 / 2
Регистрация: 28.09.2013
Сообщений: 32
|
|
24.01.2014, 00:28 [ТС] | 3 |
Убежденный, Это то понятно, я просто хотел реализацию Node вынести отдельно, как тогда будет?
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
24.01.2014, 01:39 | 4 | |||||
0
|
Ушел с форума
|
|||||||||||
24.01.2014, 10:37 | 5 | ||||||||||
У компилятора даже нет данных о том, сколько байт под него выделить.
Нельзя сначала написать "struct sometype", а затем где-то ниже "реализовать" ее через какое-нибудь "struct sometype {};".
0
|
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
|
||||||
25.01.2014, 15:44 | 6 | |||||
Привет всем. Есть такой код:
0
|
Ушел с форума
|
|
25.01.2014, 15:51 | 7 |
А где здесь методы iterator ?
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
||||||
25.01.2014, 18:04 | 8 | |||||
iterator можно описать примерно так:
1
|
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
|
|||||||||||
26.01.2014, 00:08 | 9 | ||||||||||
Класс определен отдельно.
Я нашел ответ. Вот код:
Например, как будет выглядеть прототип operator++ вне определения класса iterator? Так? : template<typename T> list<T>::iterator& list<T>::iterator::operator++() {}; Ответ - почти так. iterator - зависимое имя шаблона list. C++ не знает что такое list<T>::iterator - это может быть и открытым статическим членом list<T>. Нужно явно указать, что list<T>::iterator - тип. Надо использовать слово typename: template<typename T> typename list<T>::iterator& list<T>::iterator::operator++() {};
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
26.01.2014, 00:38 | 10 |
Плохая идея добавлять эти операторы - у них будет линейная сложность.
Константность ссылки зависит от константности итератора? Это как то странно, как минимум... Добавлено через 53 секунды и нет operator == и operator -> Добавлено через 10 минут ну т.е. константность типа, на который ссылается ссылка )))
0
|
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
|
|
26.01.2014, 00:41 | 11 |
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
26.01.2014, 00:42 | 12 |
И ещё нет нужных синонимов типов вроде iterator_category, иначе, при использовании алгоритмов например, будет ошибка при инстанциировании std::iterator_traits<>.
0
|
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
|
|
26.01.2014, 01:02 | 13 |
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
26.01.2014, 01:16 | 14 |
iterator_traits позволяет определить свойства итератора - категория, тип ссылаемого элемнта, тип указателя на элемент и пр. Используется например в алгоритмах stl. Тут на англ. http://en.cppreference.com/w/c... tor_traits
Что бы это работало, нужно либо специализировать iterator_traits для своего типа (как сделано с обычными указателями), либо предоставить в своём типе итератора вложенные псевдонимы типов (как обычно делают). Добавлено через 3 минуты Можешь, например, попробовать вызвать std::copy со своими итераторами и узнать, что компилятор об этом думает)
2
|
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
|
|
26.01.2014, 01:26 | 15 |
Я пробовал for_each
Добавлено через 3 минуты gray_fox, что такое difference_type ?
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
|
26.01.2014, 01:37 | 16 |
Целочисленный знаковый тип для представления разницы между итераторами. Сделан по анологии с ptrdiff_t, который является типом результата разницы двух указателей, т.е. это обобщение ptrdiff_t по сути. Собственно, обычно difference_type и есть ptrdiff_t.
Добавлено через 6 минут Например, если вызвать std::distance, то результат будет иметь тип difference_type, который "связан" с типом переданных итераторов.
0
|
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
|
|
26.01.2014, 01:45 | 17 |
Для того, чтобы функции STL могли работать с моим классом, мне осталось только(исключая нужные перегруженные операции для конкретных функций) определить эти синонимы? Как их определить? difference_type - расстояние между обектами iterator в памяти?
0
|
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
||||||
26.01.2014, 01:54 | 18 | |||||
iDeveloper, проще всего унаследоваться от std::iterator, указав категорию итератора и тип элемента, остальное он выведет сам и определит все нужные типы.
0
|
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
|
|
26.01.2014, 17:27 | 19 |
Привет, gray_fox. Где можно найти подробное описание iterator_traits и свойств, меня интересуют reference, pointer, difference_type?. Желательно на русском и с примерами определения классов с собственными итераторами.
0
|
Форумчанин
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
|
26.01.2014, 20:47 | 20 |
Часть можно почитать тут (англ. man):
http://www.cplusplus.com/reference/iterator/ http://www.cplusplus.com/refer... or_traits/ http://en.cppreference.com/w/c... rator_tags Про итераторы (на русском) написано у Л.Аммерааль - "STL для программистов на C++" но совсем немного У Страуструпа тоже есть глава посвященная им Дэвид Р. Мюссер - "С++ и STL - справочное руководство" - тут вроде побольше было Есть еще на английском Nicolai Josuttis - "The C++ Standart Library: A Tutorial and Reference (20nd edition)". Её советую больше всего из списка
1
|
26.01.2014, 20:47 | |
26.01.2014, 20:47 | |
Помогаю со студенческими работами здесь
20
Вложенные классы!! Вложенные классы Вложенные в друг друга классы Перегрузка операция + вложенные классы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |