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

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

19.05.2014, 20:32. Просмотров 1310. Ответов 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)
{ ... }
Но в этом случае компилятор выдаёт ошибку:
Код
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)
{ ... }
Тут уж совсем комедия какая-то:
Код
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2014, 20:32
Ответы с готовыми решениями:

Явная специализация шаблонного класса
Всем привет, не могу разобраться с определением функций-членов для явной специализации Имеем след....

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

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

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

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

Добавлено через 13 минут
По-моему, дело в том, что это попытка частично специализировать функцию. С функциями такого делать нельзя, им можно давать только полные специализации.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2014, 18:34

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.