Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
14 / 14 / 8
Регистрация: 26.09.2007
Сообщений: 919

C++17 typename в параметре шаблона шаблона

19.09.2024, 13:47. Показов 2621. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Изучаю С++17 по документу

https://ru.cppreference.com/w/... support/17

третий пункт

typename в параметре шаблона шаблона

описан здесь

https://www.open-std.org/jtc1/... n4051.html

Пример из описания:

C++
1
2
3
4
5
6
7
template<typename T> struct A {};
template<typename T> using B = int;
 
template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here
Что дает это изменение С++17?

Я так понял что такой синтаксис позволяет различать где шаблоны для классов, где шаблоны для простых типов например int и если шаблон для класса то не может быть использован например простой тип int, float тп. Кто может уточнить информацию?

Например понятно следующее:

C++
1
template<typename T> struct A {};
что тип Т используется внутри структуры А.

А что здесь ниже, какой тип используется не ясно:

C++
1
template<template<typename> class X> struct C;
Кто может уточнить?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.09.2024, 13:47
Ответы с готовыми решениями:

Gtest, доступ к элементам базового класса-шаблона без указания параметров шаблона. баг или фича?
Всем привет. Продолжаю экспертизу gtest/gmock. Количество ошибок и багов зашкаливает. Ничего удивительного, учитывая то, ...

Наследуемый класс в параметре шаблона
Нужно ограничить классы, передаваемые в параметры шаблона до классов, наследуемых от заданного. Пример- два класса : Класс...

Для использование шаблона переменной требуется список аргументов шаблона
Здравствуйте! Не могу понять в чём проблема. //ALL2.cpp #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;Windows.h&gt; ...

15
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
19.09.2024, 19:29
Цитата Сообщение от kurlyak Посмотреть сообщение
что тип Т используется внутри структуры А.
Не, это неправильно.
T - это параметр шаблона A. Никакой структуры тут нет. Есть шаблон структуры. Сама структура появится только после инстанцирования.

Цитата Сообщение от kurlyak Посмотреть сообщение
А что здесь ниже, какой тип используется не ясно:
Это не тип. Это другой шаблон, используемый в качестве параметра шаблона C. Гугли шаблонные параметры шаблонов. А лучше у Вандевурда почитай.

Это всё как бы инфа из С++03. Наверное надо сначала С++03 уверенно освоить, прежде чем на С++17 замахиваться?

Цитата Сообщение от kurlyak Посмотреть сообщение
Что дает это изменение С++17?
Можно писать typename там, где раньше можно было писать только class. Косметическое изменение для единообразия записи кода.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
20.09.2024, 06:10
Цитата Сообщение от kurlyak Посмотреть сообщение
Что дает это изменение С++17?
Оно ничего принципиального не дает кроме того, что рань при объявлении шаблонного-шаблонного параметра требовалось использовать ключевое слово class
template <template < что-то > class X> class SomeClass { что-то };
а теперь можно использовать ключевое слово typename
template <template < что-то > typename X> class SomeClass { что-то };
Изменение чисто косметическое, оба варианта эквивалентны.
2
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
20.09.2024, 06:17
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
template < что-то > class X
такой вариант нагляднее, кстати
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
20.09.2024, 06:18
Цитата Сообщение от kurlyak Посмотреть сообщение
Я так понял что такой синтаксис позволяет различать где шаблоны для классов, где шаблоны для простых типов например int
Нет, ничего он не позволяет различать.

Просто раньше в С++ было так, что шаблон типа - это обязательно класс. А вот с С++11 появился "шаблонный typedef" (через using), благодаря которому шаблон типа - это уже не обязательно класс. В таких условиях требование использовать именно class при объявлении шаблонных-шаблонных параметров выглядит странно и лишь сбивает с толку.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2024, 21:59
Цитата Сообщение от ablex Посмотреть сообщение
Наверное надо сначала С++03 уверенно освоить,
Это ещё что ?
С++03 устарел давно (динозавры вымерли позже), начинать нужно либо с 14 либо с 17 стандарта.

Добавлено через 4 минуты
Цитата Сообщение от kurlyak Посмотреть сообщение
template<typename T> struct A {};
template<typename T> using B = int;
template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here
Это даже не скомпилируется.
А вообще, что бы меньше было тем про шаблоны : https://cppinsights.io
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
20.09.2024, 22:12
Цитата Сообщение от SmallEvil Посмотреть сообщение
Это даже не скомпилируется.
Что значит "не скомпилируется"?

Это не скомпилировалось бы до того изменения, о котором идет речь в вопросе. И это прекрасно скомпилируется в C++17 и выше.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
20.09.2024, 22:16
Цитата Сообщение от SmallEvil Посмотреть сообщение
Это ещё что ?
Это о том, что в данном треде идёт речь о "патче" на фичу из с++03. Если ТС не понял что этот патч делает, то значит оригинальную фичу он не знает. Учитывая особенную любовь комитета к сохранению преемственности версий языка, ТСу очень сложно будет понимать патчи новых версий, если он недостаточно хорошо знает старую.
Так понятнее?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
20.09.2024, 22:50
Цитата Сообщение от ablex Посмотреть сообщение
Так понятнее?
Вполне.
Пора отписываться от этого ущербного ТСа.

Добавлено через 31 минуту
Цитата Сообщение от kurlyak Посмотреть сообщение
Изучаю С++17 по документу
Изучать ЯП нужно по книгам, это все сухая документация, после осознания используемых технологий вы сможете пользоваться документацией.
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
23.09.2024, 06:40
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что значит "не скомпилируется"?
Какая именно буква в словосочетании "не скомпилируется" оказалась вам не понятной?

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это не скомпилировалось бы до того изменения, о котором идет речь в вопросе. И это прекрасно скомпилируется в C++17 и выше.
Чушь.

Напоминаю контекст: речь идет о коде:

Цитата Сообщение от SmallEvil Посмотреть сообщение
template<typename T> struct A {};
template<typename T> using B = int;
template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here
Это даже не скомпилируется.
Разумеется, это не скомпилируется.
С++ не позволяет создавать объекты неполных типов.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12943 / 6810 / 1821
Регистрация: 18.10.2014
Сообщений: 17,234
23.09.2024, 20:34
Цитата Сообщение от eva2326 Посмотреть сообщение
Какая именно буква в словосочетании "не скомпилируется" оказалась вам не понятной?
Очень простая.

Код, процитированный выше, вместе с комментариями про "ok", "cannot" и т.п. скопирован без изменений напрямую из предложения n4051 на open-std.org. Я думаю, всем прекрасно понятно, что имел в виду автор этого предложения под этим кодом и этими комментариями. Понятно то, что речь совсем не шла о буквальной компилируемости этого огрызка кода, а лишь об условной корректности приведенных объявлений в рамках ряда очевидных допущений. В частности, понятно то, что вопросы полноты типов в определениях объектов к теме предложения n4051 никакого отношения не имеют.

Отсюда проистекает и мой вопрос: что значит "не скомпилируется"? Вы не согласны с выводами автора предложения по ссылке даже в рамках сделанных им условностей и допущений? Или вы [зачем-то] буквально пытались скармливать этот огрызок кода компилятору?
0
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
23.09.2024, 23:03
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
всем прекрасно понятно, что имел в виду автор этого предложения
Балабольство: попытка балаболить за всех.
Домыслы не интересуют.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Отсюда проистекает и мой вопрос: что значит "не скомпилируется"?
Поменьше фантазируйте, и побольше смотрите на факты.

Человек просто констатировал очевидный факт:
Цитата Сообщение от SmallEvil Посмотреть сообщение
Сообщение от kurlyak
template<typename T> struct A {};
template<typename T> using B = int;
template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here
Это даже не скомпилируется.
Да, "это" даже не скомпилируется.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы не согласны с выводами автора предложения по ссылке даже в рамках сделанных им условностей и допущений?
Какая разница, что я думаю по поводу автора предложения ?
Это не имеет никакого отношения к тому факту, что SmallEvil справедливо заметил, что код некомпилябельный, а вы почему то не осилили, что означает словосочетание "не скомпилируется".

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
вы [зачем-то] буквально пытались скармливать этот огрызок кода компилятору?
Нет, не пыталась.
Мне итак очевидно, что огрызок кода некомпилябельный.

А вот вам не помешало бы.
Что бы у вас вот таких вопросов не возникало:
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что значит "не скомпилируется"?
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,377
25.09.2024, 11:31
Цитата Сообщение от kurlyak Посмотреть сообщение
template<typename T> struct A {};
template<typename T> using B = int;
template<template<typename> class X> struct C;
C<A> ca; // ok
C<B> cb; // ok, not a class template
template<template<typename> typename X> struct D; // error, cannot use typename here
код такого типа - это "Невнятная" из репертуара Эдуарда Сурового.
Даже в учебных целях максимум что от него можно получить - это успешная компиляция...
Опытные программисты не рекомендуют использовать шаблоны. Однако я считаю, что в узком круге задач они все же применимы лишь для создания контейнеров.
Не нужно изучать по документам. нужен учебник (а такого не существует в природе для с++), в котором последовательно, на наглядных практических примерах рассмотрены все аспекты языка, библиотек, компилятора, IDE, структур данных и методов их обработки. и это только вступление.
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
25.09.2024, 21:04
Цитата Сообщение от vlisp Посмотреть сообщение
Опытные программисты не рекомендуют использовать шаблоны
наверное, это программисты на Си. Вот и не рекомендуют
0
 Аватар для abit
870 / 529 / 149
Регистрация: 03.02.2013
Сообщений: 1,859
26.09.2024, 02:10
Цитата Сообщение от Алексей1153 Посмотреть сообщение
наверное, это программисты на Си. Вот и не рекомендуют
Вообще АНБ не рекомендует писать программы на C/С++
запишете языки, на которых стоит писать:
Python, Java, C#, Go, Delphi/Object Pascal, Swift, Ruby, Rust, Ada
0
фрилансер
 Аватар для Алексей1153
6462 / 5670 / 1131
Регистрация: 11.10.2019
Сообщений: 15,096
26.09.2024, 08:05
Цитата Сообщение от abit Посмотреть сообщение
АНБ
а кто это? И почему он так делает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2024, 08:05
Помогаю со студенческими работами здесь

Определение метода-шаблона за пределами шаблона класса
День добрый! Разбираюсь в шаблонах, решил копнуть поглубже. Вот пример: template &lt;typename T1&gt; class K // шаблон класса { ...

Ошибка "использование списка аргументов шаблона в объявлении основного шаблона не допускается"
Я где-то видел подобную класс template&lt;typename T&gt; class sml&lt;4, T&gt; {...} Но когда я пытаюсь так сделать у меня выдаёт...

получение ссылки на функцию из класса шаблона и передача ее как параметр шаблона
Доброго времени суток! Получилась вот такая странная проблема, хотя не понимаю почему в С++ возникают ошибки в таком случае Код: ...

Ссылка на объект шаблона как поле шаблона класса)
Здравствуйте, подскажите, пожалуйста. Есть шаблон классаtemplate &lt; int ArrayLength &gt; class Vertex{ public: float x; float y;...

Редактирование шаблона сайта и шаблона письма
Помогите найти , где и как ? Т.е. уже 3 дня роюсь и не в состоянии найти где убить пару кнопок и поменять логотип и где редактировать...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru