Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Plintus
2 / 2 / 0
Регистрация: 11.01.2011
Сообщений: 16
#1

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

19.05.2014, 20:32. Просмотров 558. Ответов 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>СБОЙ построения.
В общем, свои мысли заканчиваются, осталось надеяться, что кто-то с таким сталкивался и может подсказать.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2014, 20:32     Явная специализация метода для типа шаблонного класса
Посмотрите здесь:
C++ Явная специализация шаблонного класса
C++ Явная специализация шаблона для пользовательского типа
C++ Явная специализация класса
Явное создание экземпляра класса и явная специализация шаблона класса C++
Явная специализация шаблона класса и ее методы C++
Специализация шаблонного класса C++
Вызов метода у шаблонного поля, шаблонного класса C++
Возврат объекта шаблонного типа от типа Type из специализации шаблона метода от того же типа C++
Специализация метода темплейтного класса вложенного в темплейтный класс C++
C++ Явная специализация
явная специализация C++
Функция как аргумент шаблонного метода класса C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gng
632 / 478 / 130
Регистрация: 08.09.2013
Сообщений: 1,264
20.05.2014, 17:42     Явная специализация метода для типа шаблонного класса #2
Цитата Сообщение от Plintus Посмотреть сообщение
А теперь я хочу добавить явную специализацию указанного выше метода для типа A<Type>, т.е. для типа, который сам также является шаблонным.
Вы точно знаете, что такое возможно?
На особенности C++ я по привычке смотрю через призму языка Си. Для меня шаблоны - это замена копи-паста. Замена достаточно неуклюжая, но для универсальности библиотечных функций вполне оправданная.
Компилятор генерирует код на основании шаблона всякий раз, когда встречает очередной конкретный тип. Встречая спецаализацию, компилятор генерирует другой код. А ваш случай, ИМХО, уж слижком запутан.
Впрочем, здесь на форуме есть знатоки плюсов. Подождите, может кто ответит точнее.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 1
20.05.2014, 18:34     Явная специализация метода для типа шаблонного класса #3
поторопился...

Добавлено через 13 минут
По-моему, дело в том, что это попытка частично специализировать функцию. С функциями такого делать нельзя, им можно давать только полные специализации.
Yandex
Объявления
20.05.2014, 18:34     Явная специализация метода для типа шаблонного класса
Ответ Создать тему
Опции темы

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