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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Surgery
3 / 3 / 0
Регистрация: 28.09.2013
Сообщений: 32
#1

Шаблоны и вложенные классы - синтаксис - C++

23.01.2014, 22:55. Просмотров 2208. Ответов 27
Метки нет (Все метки)

Пишу класс бинарного красно черного дерева, решил сделать структуру узла в нем вложенной, но столкнулся с проблемой непонимания синтаксиса и борьбы с языком
идея примерно такова
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T> Tree
{
    template <class ValType> class Node;
    Node<T> root;
    //...
};
//Реализация Node
template <class T> template <class Valtype> class Tree<T>::Node<Valtype> //? уже вопрос, но студия характеризует полное имя этого класса так
{
    Node<Valtype> * left; //тут совсем встрял, компилятор выдает ошибки
// (например, "Node не является шаблоном (???)", ничего не проясняющие и кажется,
// мало связанные с истинной проблемой, аналогично и на Tree<T>::Node<Valtype> * left;
 
}
Вопрос: как же все таки правильно объявить то что мне надо?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.01.2014, 22:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны и вложенные классы - синтаксис (C++):

Вложенные классы. Что за синтаксис такой? - C++
Всем привет! Писал код с вложенным классом, столкнулся с таким синтаксисом: template &lt;typename Type&gt; class ExternalClass { ...

Вложенные классы!! - C++
НЕ могу разобраться ка это работает!!! приведите пожалуйста простой пример как это работает с реализацией класса

вложенные классы - C++
Здорова господа! Снова мучаю класс String еще не замучал. Не могу скомпилировать программу с вложенным классом вот код: #include...

Вложенные классы - C++
Где можно почитать нормальную информацию о них? Читаю книгу С.Праты там непонятно что(привел внизу скрин таблицы, которую я вообще не...

Вложенные классы - C++
class A { private: B b_class; int a; public: A(); }; class B

Вложенные в друг друга классы - C++
Есть исходный код: class1.h #pragma once #include &quot;class2.h&quot; class class1 { private: class2* c2; public: ...

27
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
26.01.2014, 01:37 #16
Цитата Сообщение от iDeveloper Посмотреть сообщение
gray_fox, что такое difference_type ?
Целочисленный знаковый тип для представления разницы между итераторами. Сделан по анологии с ptrdiff_t, который является типом результата разницы двух указателей, т.е. это обобщение ptrdiff_t по сути. Собственно, обычно difference_type и есть ptrdiff_t.

Добавлено через 6 минут
Например, если вызвать std::distance, то результат будет иметь тип difference_type, который "связан" с типом переданных итераторов.
0
iDeveloper
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
26.01.2014, 01:45 #17
Для того, чтобы функции STL могли работать с моим классом, мне осталось только(исключая нужные перегруженные операции для конкретных функций) определить эти синонимы? Как их определить? difference_type - расстояние между обектами iterator в памяти?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
26.01.2014, 01:54 #18
iDeveloper, проще всего унаследоваться от std::iterator, указав категорию итератора и тип элемента, остальное он выведет сам и определит все нужные типы.
C++
1
2
3
struct iterator : std::iterator<std::bidirectional_iterator_tag, T> {
   // ...
};
0
iDeveloper
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
26.01.2014, 17:27 #19
Привет, gray_fox. Где можно найти подробное описание iterator_traits и свойств, меня интересуют reference, pointer, difference_type?. Желательно на русском и с примерами определения классов с собственными итераторами.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7510 / 4642 / 700
Регистрация: 29.11.2010
Сообщений: 12,678
26.01.2014, 20:47 #20
Часть можно почитать тут (англ. man):
http://www.cplusplus.com/reference/iterator/
http://www.cplusplus.com/reference/iterator/iterator_traits/
http://en.cppreference.com/w/cpp/iterator/iterator_tags

Про итераторы (на русском) написано у
Л.Аммерааль - "STL для программистов на C++" но совсем немного
У Страуструпа тоже есть глава посвященная им
Дэвид Р. Мюссер - "С++ и STL - справочное руководство" - тут вроде побольше было

Есть еще на английском Nicolai Josuttis - "The C++ Standart Library: A Tutorial and Reference (20nd edition)". Её советую больше всего из списка
1
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
26.01.2014, 20:51 #21
Цитата Сообщение от iDeveloper Посмотреть сообщение
Где можно найти подробное описание iterator_traits и свойств, меня интересуют reference, pointer, difference_type?
Наиболее подробно это описано в стандарте языка, я думаю) А так у меня например есть книжка B. Stroustrup "The C++ Programming Language" 3-d edition, там в Chapter 19. Iterators and Allocators об этом написано, думаю найти на русском труда не составит.
1
iDeveloper
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
27.01.2014, 12:51 #22
MrGluck, большое спасибо.

Добавлено через 15 часов 36 минут
Привет gray_fox. Есть небольшая проблема:
когда мы пишем - const int* ptr, то с помощью ptr нельзя менять значение переменной на которую указывает ptr. Как так же сделать с моим итератором - const list<int>::iterator iter. ?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.01.2014, 13:04 #23
iDeveloper, есть константный итератор. Это другой класс list<int>::const_iterator
0
iDeveloper
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
27.01.2014, 13:13 #24
мне нужен итератор на константу, а не константный итератор.
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
27.01.2014, 13:39 #25
Цитата Сообщение от iDeveloper Посмотреть сообщение
мне нужен итератор на константу, а не константный итератор.
вы попробуйте сначала, а потом возмущайтесь
Member type const_iterator is a random access iterator type that points to a const element.
0
iDeveloper
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
27.01.2014, 13:47 #26
Цитата Сообщение от Tulosba Посмотреть сообщение
Member type const_iterator is a random access iterator type that points to a const element.
Да Вы правы. Посмотрел как работают итераторы и константные итераторы контейнеров STL. Просто понятие константный итератор для встроенных типов означает другое.
0
iDeveloper
0 / 0 / 0
Регистрация: 24.01.2014
Сообщений: 21
28.01.2014, 23:43 #27
Привет, gray_fox. Я создал итератор, вроде бы работает нормально. Но когда я использую
C++
1
std::transform(list_int.begin(),list_int.end(),list_int.begin(),tForm)
, то появляется - "error C4996: 'std::_Transform1': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators'" . Я знаю что можно написать "#define _SCL_SECURE_NO_WARNINGS" чтобы отключить предупреждение, но я хотел бы чтобы оно без этого работало. Как это исправить?
0
gray_fox
What a waste!
1522 / 1227 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
29.01.2014, 16:27 #28
Цитата Сообщение от iDeveloper Посмотреть сообщение
Как это исправить?
Не знаю, VС вообще на многие стандартные функции ругается как на небезопасные; доля правды в этом есть, конечно, но я эти предупреждения всегда отключаю)
1
29.01.2014, 16:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2014, 16:27
Привет! Вот еще темы с ответами:

Перегрузка операция + вложенные классы - C++
Уже второй раз прошу помощи, никто толком не может помочь( Как правильно реализовать операцию &quot;-&quot; класса Time в таком примере? ...

классы, шаблоны - C++
Всем добра, Буду очень признателен получить помощь в очередной раз. Поверхностные ответы не помогут, но все равно спасибо за...

Композиция двух классов и вложенные классы - C++
Привет, народ! Собственно говоря вот задача. Существуют 2 класса: 1. Создать класс LongLong для работы с целыми числами из 64 бит....

C++ классы полиморфизм шаблоны - C++
Помогите решить ... вот сделал 1 лаб. роботу, немного кривая но сойдет и нужно еще 3-и задания во 2 лабе ... мне кажется то что я попрошу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.