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

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

19.05.2014, 20:32. Показов 2580. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru