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

Явная специализация метода для типа шаблонного класса

19.05.2014, 20:32. Показов 2596. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер, уважаемые знатоки!
Хочу задать вопрос по созданию шаблонов. В общем, пусть у меня есть шаблон некоторого класса:
C++
1
2
3
4
5
6
7
template <typename Type> class A
{...
public:
    ...
    A operator*(A& a);
    ...
};
Методы я определяю в том же заголовочном файле, что и класс (как я понял, с шаблонными классами по-другому никак), обычным образом:
C++
1
2
template <typename Type> A<Type> A<Type>::operator*(A<Type>& a)
{ ... }
Всё работает. А теперь я хочу добавить явную специализацию указанного выше метода для типа A<Type>, т.е. для типа, который сам также является шаблонным.

Вот тут начинаются бесконечные бубенные пляски, чтение различных углублённых материалов о шаблонах (ни в одном из найденных мной подобный случай отдельно не рассматривается) - всё это в конце концов ни к чему так и не привело.
Самая адекватная конструкция, которая, на мой взгляд должна здесь получиться, такая:
C++
1
2
template <> template <typename Type> A<A<Type>> A<A<Type>>::operator*(A<A<Type>>& a)
{ ... }
Но в этом случае компилятор выдаёт ошибку:
Code
1
2
3
4
5
6
7
8
9
error C2244: A<Type>::operator *: не удается сопоставить определение функции существующему объявлению
1>          определение
1>          'A<A<Type>> A<A<Type>>::operator *(A<A<Type>> &)'
1>          существующие объявления
1>          'A<A<Type>> A<Type>::operator *(A<A<Type>> &)'
1>          'A<Type> A<Type>::operator *(Type)'
1>          'Type A<Type>::operator *(A<Type> &)'
1>
1>СБОЙ построения.
Будто бы намекает сделать специализацию для всего класса. Но как-то это не правильно, если нужно поменять всего одну функцию. Попробуем изменить определение:
C++
1
2
template <> template <typename Type2> A<A<Type2>> A<Type2>::operator*(A<A<Type2>>& a)
{ ... }
Тут уж совсем комедия какая-то:
Code
1
2
3
4
5
6
7
8
9
error C2244: A<Type>::operator *: не удается сопоставить определение функции существующему объявлению
1>          определение
1>          'A<A<Type2>> A<Type2>::operator *(A<A<Type2>> &)'
1>          существующие объявления
1>          'A<A<Type>> A<Type>::operator *(A<A<Type>> &)'
1>          'A<Type> A<Type>::operator *(Type)'
1>          'Type A<Type>::operator *(A<Type> &)'
1>
1>СБОЙ построения.
В общем, свои мысли заканчиваются, осталось надеяться, что кто-то с таким сталкивался и может подсказать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.05.2014, 20:32
Ответы с готовыми решениями:

Явная специализация шаблонного класса
Всем привет, не могу разобраться с определением функций-членов для явной специализации Имеем след. код: template &lt;class Type&gt; ...

Явная специализация шаблона для пользовательского типа
Здравствуйте! Сразу извиняюсь если вопрос покажется глупым, перечитал справочник по шаблонам, но так и не нашёл ответ. Есть шаблон класса: ...

Явная специализация для friend функции класса
Как создать специализацию для какого-то конкретного типа на примере данной функции? template &lt;class T&gt; TMatrix&lt;T&gt;...

2
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
20.05.2014, 17:42
Цитата Сообщение от Plintus Посмотреть сообщение
А теперь я хочу добавить явную специализацию указанного выше метода для типа A<Type>, т.е. для типа, который сам также является шаблонным.
Вы точно знаете, что такое возможно?
На особенности C++ я по привычке смотрю через призму языка Си. Для меня шаблоны - это замена копи-паста. Замена достаточно неуклюжая, но для универсальности библиотечных функций вполне оправданная.
Компилятор генерирует код на основании шаблона всякий раз, когда встречает очередной конкретный тип. Встречая спецаализацию, компилятор генерирует другой код. А ваш случай, ИМХО, уж слижком запутан.
Впрочем, здесь на форуме есть знатоки плюсов. Подождите, может кто ответит точнее.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
20.05.2014, 18:34
поторопился...

Добавлено через 13 минут
По-моему, дело в том, что это попытка частично специализировать функцию. С функциями такого делать нельзя, им можно давать только полные специализации.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2014, 18:34
Помогаю со студенческими работами здесь

Явная специализация класса
Код переписан из книги, однако не компилируется. Что не так со специализацией класса? // Явная специализация класса. #include...

Явное создание экземпляра класса и явная специализация шаблона класса
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Явная специализация шаблона класса и ее методы
На 93 строке явная специализация шаблона класса под char. Но я нигде не могу найти, как мне правильно записать методы для него. Если тело...

Специализация шаблонного класса
Здравствуйте ! Задача: нужно &quot;вытянуть&quot; тип переменной из списка аргументов конструктора (см. текст). Возможно ли, вообще, такое ?...

Специализация методов шаблонного класса
Вот шаблонный класс матрицы из объектов типа параметра-шаблона, нужна специализация для типа std::string, мой вариант в самом конце для...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[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
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru