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

Шаблоны - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.96
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
24.02.2010, 12:49     Шаблоны #1
Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать так нельзя?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2010, 12:49     Шаблоны
Посмотрите здесь:

шаблоны C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». C++
Шаблоны в C++ C++
Шаблоны C++
C++ Шаблоны
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
01.03.2010, 12:52     Шаблоны #21
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Evg:
А тебе интересно?
Мне интересно для самообразования, поскольку Си++ я скорее "не знаю", чем "знаю"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 12:59     Шаблоны #22
fasked:
Эта штука хороша, но не даёт широких возможностей:
Так как такие шаблонные функции будут работать только с типами,
для которых будет явное инстацирование, то есть для типов которые ты пропишишь в явном инстацировании.

Если в такую допустим передать Объект типа MyClass или BClass функция не будет
работать, так как об этом типе ей не известно, тебе предётся его заранее прописать.

Пример явного инстацирования: объявление в файле .h
C++
1
2
3
template double Sort<double>(double *mas ,int size);
template int Sort<int>(int *mas,int size);
template float Sort<float>(float*mas,int size);
kazak
 Аватар для kazak
3029 / 2350 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
01.03.2010, 13:05     Шаблоны #23
Genius Ignat, а ты случаем не путаешь с перегрузкой функций?)
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 13:13     Шаблоны #24
Полноценного кода привести не могу компилятор не поддреживает, старый очень.

Этот способ был описан в книге: В.В.Лаптев С++ Объектно-ориентированное программтрование.
В книге написано в соответствии со стандартом C++ 2003 года.

Добавлено через 7 минут
а ты случаем не путаешь с перегрузкой функций.
Очень похоже.
Может в этом есть другой смысл.
Похоже на перегрузку, и не понятно на кой автор это показывал.
fasked:
А кстати вот и решение нашлось используй перегрузку фнкций.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
01.03.2010, 13:20     Шаблоны #25
Genius Ignat, напомню, что речь шла о том, что хочется пользователю выдать библиотеку, в *.h файлах от которой есть лишь описания шаблонных функций, но нет их реализации (типа код мы не показываем). Явное инстациирование в *.h файле ну ни разу под это определение не попадает. К тому же совершенно непонятно, что делать с тем кодом, который ты привёл. Вариант "такие шаблонные функции будут работать только с типами, для которых будет явное инстацирование" точно так же является недопустимым для пользовательской библиотеки (ибо нафиг нужен пользователю такой шаблон, который работает только для ограниченного набора типов)

Добавлено через 46 секунд
Цитата Сообщение от Genius Ignat Посмотреть сообщение
А кстати вот и решение нашлось используй перегрузку фнкций.
И ручками описывать реализацию каждой функции (для каждого типа)?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.03.2010, 13:24  [ТС]     Шаблоны #26
Evg,
Genius Ignat,
Шаблоны

Цитата Сообщение от Evg Посмотреть сообщение
И ручками описывать реализацию каждой функции (для каждого типа)?
В том то и дело, что не хочется так выходить из ситуации, весь смысл шаблонов пропадает
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16825 / 5246 / 321
Регистрация: 30.03.2009
Сообщений: 14,127
Записей в блоге: 26
01.03.2010, 13:28     Шаблоны #27
Цитата Сообщение от fasked Посмотреть сообщение
Еще один вопрос по шаблонам.
При перегрузка оператора <<
C++
1
friend std::ostream &operator << (std::ostream &out, BaseMatrix<T> &m);
Возникает ошибка ''undefined reference''

Исправляю прототип на следующий
C++
1
friend std::ostream &operator << (std::ostream &out, BaseMatrix<int> &m);
И ошибка соответственно пропадает, то есть как я понимаю необходимо для каждого типа описать собственную функцию? Шаблоны плохо работают с потоками?
Я "не знаю" Си++, нету практики работы с шаблонами, слабо себе представляю, как всё это дело выглядит в описании. Но тем не менее, попробую ответить. Но не могу датьгарантии правильности ответа. Когда ты переопределяешь свой оператор "<<", то ты фактически реализуешь (инстациируешь) функцию (оператор) для КОНКРЕТНОГО типа. "BaseMatrix<int>" является конкретным типом. "BaseMatrix<T>" конкретным типом не является
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 14:58     Шаблоны #28
fasked:
Ни кто лучше автора языка тебе не ответит:
Миниатюры
Шаблоны  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2010, 16:48     Шаблоны
Еще ссылки по теме:

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны C++
C++ Шаблоны C++11
C++ Шаблоны в C++

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

Или воспользуйтесь поиском по форуму:
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
01.03.2010, 16:48     Шаблоны #29
Цитата Сообщение от fasked Посмотреть сообщение
Еще один вопрос по шаблонам.
При перегрузка оператора <<
C++
1
friend std::ostream &operator << (std::ostream &out, BaseMatrix<T> &m);
Возникает ошибка ''undefined reference''

Исправляю прототип на следующий
C++
1
friend std::ostream &operator << (std::ostream &out, BaseMatrix<int> &m);
И ошибка соответственно пропадает, то есть как я понимаю необходимо для каждого типа описать собственную функцию? Шаблоны плохо работают с потоками?
fasked, Дело в том что оператор вывода должен объявляется другом следующим образом:
C++
1
2
template<class T>
friend std::ostream &operator << (std::ostream &out, BaseMatrix<T> &m);
Пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
 
template<class T>
class Foo
{
  template<class T> friend std::ostream& operator<<(std::ostream& os, const Foo<T>& foo);
 
public:
  Foo(const T& field)
  : field(field)
  {}
 
private:
  T field;
};
 
template<class T>
std::ostream& operator<<(std::ostream& os, const Foo<T>& foo)
{
  return os << foo.field;
}
 
int main()
{
  Foo<int>    foo1(1);
  Foo<double> foo2(2.0);
 
  std::cout << foo1 << " " << foo2 << std::endl;
 
  return 0;
}
Добавлено через 1 час 22 минуты
Прошу прощения, но приведенный мною пример не совсем верен.
Дело в том, что в таком случае любая спецификация оператора вывода будет дружественной классу Foo.
Исправленная версия:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
template<class T> class Foo;
 
template<class T> std::ostream& operator<<(std::ostream&, const Foo<T>&);
 
template<class T>
class Foo
{
  friend std::ostream& operator<<<T>(std::ostream& os, const Foo<T>& foo);
 
public:
  Foo(const T& field)
  : field(field)
  {}
 
private:
  T field;
};
 
template<class T>
std::ostream& operator<<(std::ostream& os, const Foo<T>& foo)
{
  return os << foo.field;
}
 
int main()
{
  Foo<int> foo1(1);
  Foo<double> foo2(2.0);
 
  std::cout << foo1 << " " << foo2 << std::endl;
 
  return 0;
}
Yandex
Объявления
01.03.2010, 16:48     Шаблоны
Ответ Создать тему

Метки
шаблоны
Опции темы

Текущее время: 10:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru