|
0 / 0 / 0
Регистрация: 24.12.2022
Сообщений: 4
|
|||||||||||
Компилятор MSVC2022 не видит конструктор перемещения. (Пикус, CRTP, Policy, type deduction)24.12.2022, 23:53. Показов 1284. Ответов 7
Суть проблемы:
Компилятор не видит конструктора перемещения для CRTP шаблона, если этот шаблон создается извлекая типы из шаблона образца, речь идет материале из книги "Пикус Ф. - Идиомы и паттерны проектирования в современном С++ - 2020", глава Перепривязка политики, раздел "Продвинутое проектирование на основе политик", страница 347. Оригинальный пример не компилируется студией 2022, и я его немного изменил, будут приведены оба варианта мой и оригинал. Вопросы: 1. Почему компилятор не видит конструктор перемещения. 2. Почему не не компилируется оригинальный вариант. Пример измененный мной, в котором компилятор не видит конструктор перемещения, детали в комментариях примера.
Оригинальный код, не компилируется MSVC2022
Не в новичковом разделе так как книга позиционируется как не для начинающих.
0
|
|||||||||||
| 24.12.2022, 23:53 | |
|
Ответы с готовыми решениями:
7
|
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|||||||||||||||
| 25.12.2022, 13:13 | |||||||||||||||
Сообщение было отмечено Audeze как решение
Решениеp и q различны, а конструктор перемещения только для одинаковых типов определен.А различны они потому, что алиас шаблона фактически объявляет новое имя шаблона. Простой пример:
Однако полную специализацию алиаса можно зафрендить: У второго варианта уберите ключевое слово class, должно компилироваться.Делать друзьями все специализации тут не требуется. А для первого варианта ConversionPolicy не должен быть алиасом или параметром шаблона.
1
|
|||||||||||||||
|
0 / 0 / 0
Регистрация: 24.12.2022
Сообщений: 4
|
||
| 25.12.2022, 17:53 [ТС] | ||
|
Благодарю за разъяснение.
Я так понял что у Пикуса не было проблем с двойным освобождением памяти потому что он использовал компилятор где фактически совпадающие шаблоны являются равными вне зависимости от того что алиас имени не равен имени, или же в компиляторе что использовал Пикус алиас имени приравнивается к оригинальному имени. Что посоветуете прочитать? Я, явно плохо ориентируюсь в вопросе.
0
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||
| 25.12.2022, 18:12 | ||||
|
Добавлено через 1 минуту
0
|
||||
|
0 / 0 / 0
Регистрация: 24.12.2022
Сообщений: 4
|
||
| 25.12.2022, 19:06 [ТС] | ||
|
Но как я понял elaborated-type-specifier должен использоваться для классов о которых пока ничего не известно, а во всех остальных случаях friend simple-type-specifier ; friend typename-specifier ; Хотя понял это наверное не то слово, тут скорее принял что делай вот так потому что потому. А есть какие то внятные труды объясняющие стандарт? что бы извлекать понимание сути из справочников нужно уже быть очень хорошо погруженным в тему, иначе это экстрим какой то. Речь про именно понять. Добавлено через 25 минут Да вот кстати а как грамотно решить эту задачу с извлечением типа из объекта донора? SmartPtr<ptr_t::value_t, ptr_t::deletion_policy_t, ptr_t::copy_move_policy_t, ImplicitRaw> q(std::move(p)); это ведь не решение, мы же не можем знать что там ImplicitRaw.
0
|
||
|
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||||
| 25.12.2022, 19:16 | ||||
SmartPtr с ptr_t::conversion_policy_t, то elaborated-type-specifier не мог применятся к алиасу. Если заменить ptr_t::conversion_policy_t на имя шаблона класса, как я писал, то скомпилируется и с ключевым словом class.Можно извлечь только его специализацию, чтоб она "ссылалась" на тот же тип. Но это тут ничем не поможет.
0
|
||||
|
0 / 0 / 0
Регистрация: 24.12.2022
Сообщений: 4
|
||
| 25.12.2022, 19:55 [ТС] | ||
|
class C {}; typedef C Ct; .... class X3 { friend class C; }; class X4 { friend class Ct; // Error C2371 'Ct': redefinition; different basic types }; Книгу что ли написать про стандарт
0
|
||
|
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
|
|
| 26.12.2022, 17:46 | |
|
0
|
|
| 26.12.2022, 17:46 | |
|
Помогаю со студенческими работами здесь
8
Конструктор перемещения
Конструктор перемещения
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
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
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|