2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
|
|||||||||||
Друзья шаблонного класса. Использование вложенной в класс структуры03.01.2015, 18:32. Показов 4406. Ответов 10
Метки нет Все метки)
(
Всем привет!
Изучаю книгу "Прата С. - Язык программирования С++. Лекции и упражнения". Разобрал тему шаблоны классов и в заданиях для тренировки было предложено переделать класс очереди в шаблонный класс. Очередь реализована при помощи связанного списка (точнее односвязного). Для его работы в классе присутствует вложенное определение структуры Node, которая содержит информационную часть (сами данные), а также указатель на следующий узел. Чтобы правильно обработать связный список, в классе определены данные-члены *front и *rear типа Node. Это адрес первого и последнего узла. По заданию в качестве типа, который будет передан шаблону выступает другой сложный класс, его определение я не стал приводить. Проблема возникла, когда я попытался написать дружественную для класса функцию вывода всего содержимого списка на экран. Для этого я хочу "перебрать" с помощью цикла все узлы - от *front до *rear. Но при попытке создать в теле дружественной функции переменную i типа Node, которая иницилизирована нулевым значением, MVS выдает ошибку: Ошибка 1 error C2274: приведение типов в стиле функции: недопустимо в качестве выражения с правой стороны оператора "." (строка 143 заголовочного файла) Заголовочный файл:
![]()
0
|
03.01.2015, 18:32 | |
Ответы с готовыми решениями:
10
Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра?
Использование фабрики для шаблонного класса |
![]() ![]() 8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||
03.01.2015, 18:37 | ||||||||||||||||
![]() Решение
Объясните по-русски, что именно вы пытаетесь сделать в этой строке:
Может быть вы имели ввиду:
То есть, вы хотели создать указатель на объект вложенной структуры? Лекарство:
1
|
2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
|
|
03.01.2015, 22:44 [ТС] | |
hoggy, в этой строчке я пытаюсь создать нулевой указатель на структуру типа Node для его использования в цикле for ниже. При помощи цикла for затем я пытаюсь "перебрать" все узлы - от *front до *rear и вывести данные, которые они содержат (член item структуры Node).
Добавлено через 43 минуты Да, именно это и хотел сделать. Большое спасибо за помощь ![]() Добавлено через 3 часа 10 минут Автоматическое выведение типа это удобно конечно, но всё таки очень хочется узнать, как вручную правильно объявить тип для переменной i. Как ни пытался, не смог этого сделать. Поэтому вопрос ещё открыт.
0
|
2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
|
||||||
03.01.2015, 23:02 [ТС] | ||||||
hoggy, понял, извиняюсь за свою невнимательность.
Только запись данной строчки мне не очень понятна... Ведь вложенная структура Node - это член класса QueueTP, почему данный член нельзя использовать, например с таким синтаксисом:
![]()
0
|
![]() ![]() 8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
03.01.2015, 23:14 | |
Во-первых, вложенная структура не является членом класса.
Она является самой обычной структурой, просто объявлена в пространстве имени класса-хозяина. Вот и все. С точно таким же успехом вы могли бы объявить структуру и снаружи класса. Во-вторых, у вас нет функции. У вас есть шаблон функции: Это шаблон. В который вместо T можно подсунуть все что угодно. И когда компилятор будет его парсить, он ещё не будет знать что именно вы туда подсунете. Ни о каких QueueTP в шаблоне даже намека нет. В-третьих - правила языка. Вложенная структура класса - есть собственность этого класса. Собственность класса, а не отдельного его экземпляра. Понимаете? Хотите обратиться к структуре которая принадлежит классу - так и обращайтесь к самому классу.
1
|
2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
|
||||||||||||||||
03.01.2015, 23:51 [ТС] | ||||||||||||||||
hoggy, спасибо за ответ. Кажется понял. Попробую написать свои мысли.
Согласно теории, приведенной в учебнике, чтобы каждая специализация класса получала соответствующую специализацию друга мы используем связанные шаблонные друзья. Для этого, перед объявлением всех классов определяется специальный прототип шаблонной дружественной функции:
то мы и применяем данный синтаксис для доступа к вложенной структуре класса, ведь здесь T - это по сути имя класса:
0
|
![]() ![]() 8972 / 4318 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||||||
04.01.2015, 00:12 | |||||||||||
Да. Все верно.
Единственное: я объявляю шаблон дружественной функции немножко иначе: http://rextester.com/WGBIOJ23957
Обратите внимание на синтаксис объявления шаблона дружественной функции:
Можно было бы вообще избавиться от шаблоной-версии, и сделать френдом обычную, не шаблонную функцию. Однако данный вариант позволяет вообще не включать хэдэр iostream, если вы не планируете им пользоваться. Здесь используется фундаментальное свойство шаблонов: "если шаблон не инстанцировать, то код шаблона не войдет в компиляцию". Кроме того, такой прототип позволяет работать не только с cout, но и с wcout, и вообще с любыми инстансами шаблона ::std::basic_ostream 2. Обратите внимание на const example& obj Такая форма записи позволяет избежать необходимости писать угловые скобочки, что делает синтаксис проще. 3. Шаблон дружественной функции объявлен и определен прямо в теле класса. Это не значит, что функция стала методом класса. Вовсе нет, она по прежнему свободная отдельная от класса функция. Однако благодаря тому, что её не обязательно выносить за пределы декларации класса, можно ещё упростить синтаксис, и уменьшить количество шаблоно-кода.
1
|
4 / 4 / 0
Регистрация: 08.02.2014
Сообщений: 57
|
|||||||||||
14.07.2015, 15:13 | |||||||||||
0
|
4 / 4 / 0
Регистрация: 08.02.2014
Сообщений: 57
|
|||||||||||
16.07.2015, 15:50 | |||||||||||
Так ни кто и не помог но я сделал правда данные из очереди выводятся на экран после удаления из очереди.
0
|
16.07.2015, 15:50 | ||||||
Помогаю со студенческими работами здесь
11
Использование указателя на объект шаблонного класса в шаблонном классе. Шаблонный класс от шаблонного класса, ругается компоновщик Классы-друзья (использование данных одного класса из другого) Предусмотреть использование шаблонного класса для работы с различными типами данных Функция указатель на класс, определенный внутри шаблонного класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму:
|
|
Новые блоги и статьи
![]() |
||||
Async/await в Swift: Асинхронное программирование в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
|
Сложность Колмогорова: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
|
PostgreSQL в Kubernetes: Подготовка кластера и настройка
Mr. Docker 20.03.2025
Когда доходит до контейнеризации баз данных и особенно таких требовательных к ресурсам системах как PostgreSQL, многие команды до сих пор колеблются, прежде чем перенести их в контейнерную. . .
|
C++26: Индексирование пакетов и метапрограммирование
bytestream 20.03.2025
Эволюция C++ продолжается стремительными темпами – каждый новый стандарт приносит функциональность, о которой мы мечтали годами. Звучит слишком громко? Если вы когда-либо боролись с вариадическими. . .
|
Состояние гонки в C#: подводные камни многопоточного программирования
UnmanagedCoder 20.03.2025
Что такое состояние гонки? Это ситуация, когда результат программы непредсказуемо меняется в зависимости от порядка выполнения потоков. Проще говоря, два или более потока пытаются одновременно. . .
|
Next.js для разработки React: преимущества серверного рендеринга
Reangularity 20.03.2025
Next. js решает классическую проблему React-приложений: медленную первоначальную загрузку и плохую индексацию поисковиками. Вместо того чтобы заставлять браузер пользователя выполнять всю работу по. . .
|
JUnit или TestNG: Выбираем Java-фреймворк для тестирования
Javaican 20.03.2025
История тестовых фреймворков в Java началась в конце 90-х, когда Кент Бек и Эрих Гамма разработали JUnit - инструмент, который перевернул представление разработчиков о модульном тестировании. JUnit. . .
|
Разбиваем монолит на два микросервиса и реализуем CI/CD
ArchitectMsa 20.03.2025
Когда команда растет, а функциональность монолита расширяется, поддерживать и развивать такую систему становится все труднее. Разработчики начинают тратить много времени на разбор сложных. . .
|
Python и PDF: Создание и редактирование файлов
py-thonny 20.03.2025
Работа с PDF-документами – одна из популярных задач в современной разработке. Python предлагает несколько инструментов для создания, чтения и редактирования PDF-файлов, среди которых особенно. . .
|
Корутины в Unity и производительность WaitForSeconds
GameUnited 20.03.2025
Разработчики игр на Unity часто сталкиваются с вопросом: как выполнять действия через определённые промежутки времени, не блокируя основной поток игры? Тут как раз и приходят на помощь корутины —. . .
|