Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 1
Регистрация: 04.12.2010
Сообщений: 67
1

Реализация шаблонов

27.08.2015, 18:47. Показов 3628. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет! Можно ли как-то реализовывать шаблонный класс в другом файле?
то есть имеем заголовочный файл там задаём сам шаблонный класс вот ну а затем пишем его реализацию в другом месте.. можно ли это как-то реализовать?
пробовал делать как с обычными классами ничего не получилось компилятор ругается при инициализации шаблона каким-то типом, что нету такой реализации.. пробовал реализовывать в cpp и hpp и в main подключать только .h пока всё безуспешно.. можно ли это вообще сделать?...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.08.2015, 18:47
Ответы с готовыми решениями:

Реализация шаблонов underline_type и is_enum
Добрый вечер! Кто подскажет, как сделать шаблоны underline_type и is_enum? Смотрел type_traits,...

Реализация шаблонов класса в инлайн файле
Пытался написать шаблонный класс, реализуя как обычно объявление класса в h файле и определение...

Реализация шаблонов класса в инлайн файле
Пытался написать шаблонны MyClass.h #pragma once #define MYCLASS template <typename T>...

запрет шаблонов
У меня есть некоторая шаблонная функция, которая определена для некоторого набора типов данныхх....

16
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
27.08.2015, 18:51 2
ProgRoman, extern в помощь, только скомпилировать и доставить его с библиотекой все равно не получится, все равно нужны будут сорсы.
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
27.08.2015, 18:52 3
Нынешние реализации компиляторов C++ не поддерживают экспорт шаблонов. Поэтому не получится опредить шаблон в отдельном модуле. Придётся определять шаблон полностью в заголвочном файле.

Да, методы обычных классов, можно реализовывать в отдельном модуле. А вот шаблоны, увы…
0
1 / 1 / 1
Регистрация: 04.12.2010
Сообщений: 67
27.08.2015, 18:58  [ТС] 4
Ок понял спасибо большое!
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
27.08.2015, 20:09 5
Можете в заголовок включить файл с реализацией
0
Эксперт С++
1674 / 1046 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
27.08.2015, 21:31 6
Ещё можно реализовать шаблоны для некоторого набора параметров (например, для всех числовых типов). Инстанциировать шаблон с другими параметрами (скажем, с длинными числами) не получится, но если подставить правильные - работать будет. В общем-то почти то же самое, как если просто реализовать некий набор обычных классов.
0
1 / 1 / 1
Регистрация: 04.12.2010
Сообщений: 67
01.09.2015, 10:36  [ТС] 7
Цитата Сообщение от Croessmah Посмотреть сообщение
Можете в заголовок включить файл с реализацией
Большое спасибо так и сделал всё получилось
т.е. у меня шаблонный класс а в конце него просто инклуд с реализацией, которая тоже в заголовочном файле, так всё работает.

Добавлено через 6 минут
1. У меня тут возможно глупый вопрос.. но зачем нужна специализация шаблонного класса? она как-то облегчает дальнейшую компиляцию... зачем нужно задавать тип если можно не задавать вот это пока я не уяснил

2. и второй момент как работают шаблонные конструкторы копирования? Нужна ли в данном случае специализация или это как-то иначе реализуется...
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.09.2015, 10:48 8
ProgRoman, Бывает нужна. К примеру std::function работает исключительно с параметром типом функции вида (R(Args...)) и реализуется это только так:

C++
1
2
3
4
5
6
7
8
9
template<typename T>
class function;
 
template<typename R, typename... Args>
class function<R(Args...)>
{
};
 
function<int(int)> f;
А вот про конструкторы - поподробнее пожалста. Если конструктор копирования шаблонный - компилятор все равно сам сгенерирует конструктор копирования для текущего типа.

Добавлено через 3 минуты
Ну и специализация очень-очень часто используется в метапрограммировании. К примеру мета-функция is_same реализуется так:
C++
1
2
3
4
5
6
7
8
9
template<typename T, typename S>
struct is_same : public std::false_type
{
};
 
template<typename T>
struct is_same<T, T> : public std::true_type
{
};
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
01.09.2015, 10:59 9
Цитата Сообщение от ProgRoman Посмотреть сообщение
1. У меня тут возможно глупый вопрос.. но зачем нужна специализация шаблонного класса?
Для того, чтобы задать иное поведение для какого-то типа.
0
1 / 1 / 1
Регистрация: 04.12.2010
Сообщений: 67
01.09.2015, 11:07  [ТС] 10
Цитата Сообщение от ForEveR Посмотреть сообщение
А вот про конструкторы - поподробнее пожалста
читал в вики может что не так понял кидаю ссылку
Конструктор копирования вики
там вконце есть
...
Шаблонный конструктор не является конструктором копирования.
...
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
01.09.2015, 11:11 11
Цитата Сообщение от ProgRoman Посмотреть сообщение
читал в вики может что не так понял кидаю ссылку
По сути, шаблонного конструктора копий нет.
C++
1
2
3
4
5
6
template < typename T >
struct X
{
   template < typename U >
   X ( const X<U> & ) ; //Это шаблонный конструктор, принимающий константную ссылку на объект типа X<U>, а не конструктор копирования. X<U> != X<T>
} ;
0
1 / 1 / 1
Регистрация: 04.12.2010
Сообщений: 67
01.09.2015, 11:35  [ТС] 12
тогда получается для реализации конструктора копирования шаблонного класса правильнее всё таки сразу писать специализированные конструкторы копирования, а не один шаблонный
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.09.2015, 11:36 13
ProgRoman, Зависит от того, что значит правильно. Если конструктор копии действительно нужен и если нужно конструировать от копии с другим шаблонным параметром - пишем два варианта - шаблонный и не шаблонный, если не нужно, но нужен конструктор копии - пишем конструктор копии, если нужно только конструировать от копии с другим шаблонным параметром - только шаблонный.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
01.09.2015, 11:54 14
Цитата Сообщение от ForEveR Посмотреть сообщение
если нужно только конструировать от копии с другим шаблонным параметром - только шаблонный.
Нужно еще и конструктор копий указать (например delete, или закрытым без реализации), иначе он будет генерироваться автоматически.
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.09.2015, 11:56 15
Croessmah, Не. Я возможно неверно сформулировал. Действительно нужен - значит нужен определенный пользователем конструктор копии. И в варианте который ты процитировал рассматривается вариант, когда НЕ нужен определенный пользователем конструктор копии (хватает сгенеренного компилятором), но нужно конструировать от объекта того же класса с другим шаблонным параметром.
0
Croessmah
01.09.2015, 11:57
  #16

Не по теме:

ForEveR, мы друг друга поняли :)

0
1 / 1 / 1
Регистрация: 04.12.2010
Сообщений: 67
01.09.2015, 12:23  [ТС] 17
Огромное спасибо, за разъяснения!
0
01.09.2015, 12:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.09.2015, 12:23
Помогаю со студенческими работами здесь

Каталог шаблонов
Может кто подскажет ? Как-то раз попадалась на глаза программа, которая позволяла вести...

Экспорт шаблонов
Вопрос такой: Можно ли в Visual C++ реализовать экспорт шаблонов функций так, чтобы например в...

Наследование шаблонов
Есть некоторый класс first, реализованный по шаблону. Можно ли от него наследовать другой класс,...

использование шаблонов
не могу понять в чем дело.... для примера приведу простенькую функцию ввода элементов в вектор......


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru