С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.96
fasked
Эксперт С++
4952 / 2532 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
#1

Шаблоны - C++

24.02.2010, 12:49. Просмотров 3069. Ответов 28

Когда разделяю реализацию и прототип шаблонной в функции по разным файлам (*.h и *.cpp) происходит ошибка линковки... Я так понимаю, делать так нельзя?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.02.2010, 12:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблоны (C++):

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис) - C++
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем, корни у которых одни, решил создать эту...

Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны - C++
В одномерном массиве, состоящем из п вещественных элементов, вычислить: 1) количество элементов массива, равных 0; 2) сумму элементов...

Шаблоны C++ - C++
Написал template на С++, но он нифига не компилица, пишет мол типа не могу string в int преобразовать в строчке int out_param = (int)param;...

Шаблоны - C++
Я разбираюсь с ООП в С++ и застрял на шаблонах, будьте добры приведите пример кода, к примеру там.... вес машины и шаблон,(ну вообщем на...

Шаблоны - C++
// ConsoleApplication176.cpp : Defines the entry point for the console application. // template<class type> struct link { type...

28
Evg
Эксперт CАвтор FAQ
18382 / 6430 / 441
Регистрация: 30.03.2009
Сообщений: 17,850
Записей в блоге: 28
01.03.2010, 12:39 #16
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Надо использовать директивы явного инстацирования
"Мужик, кончай умничать, покажи пальцем, в какую сторону плыть" (c)
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 12:40 #17
Evg:
Я не умничаю, короче пишите в заголовках и все OK.
0
Evg
Эксперт CАвтор FAQ
18382 / 6430 / 441
Регистрация: 30.03.2009
Сообщений: 17,850
Записей в блоге: 28
01.03.2010, 12:44 #18
Genius Ignat, я имел в виду покажи конкретный пример, а не слова типа "Надо использовать директивы явного инстацирования", которые топикстартер, возможно, и не знает. Я, кстати, тоже не знаю
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 12:45 #19
Меня тоже интересует этот вопрос по поводу шаблонов, но достойного внимания,
решения я не видел.

Добавлено через 36 секунд
Evg:
А тебе интересно?
0
fasked
Эксперт С++
4952 / 2532 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.03.2010, 12:47  [ТС] #20
Цитата Сообщение от Genius Ignat Посмотреть сообщение
А тебе интересно?
Мне интересно
0
Evg
Эксперт CАвтор FAQ
18382 / 6430 / 441
Регистрация: 30.03.2009
Сообщений: 17,850
Записей в блоге: 28
01.03.2010, 12:52 #21
Цитата Сообщение от Genius Ignat Посмотреть сообщение
Evg:
А тебе интересно?
Мне интересно для самообразования, поскольку Си++ я скорее "не знаю", чем "знаю"
0
Genius Ignat
1237 / 775 / 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);
0
kazak
3050 / 2371 / 160
Регистрация: 11.03.2009
Сообщений: 5,437
Завершенные тесты: 1
01.03.2010, 13:05 #23
Genius Ignat, а ты случаем не путаешь с перегрузкой функций?)
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 13:13 #24
Полноценного кода привести не могу компилятор не поддреживает, старый очень.

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

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

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

Цитата Сообщение от Evg Посмотреть сообщение
И ручками описывать реализацию каждой функции (для каждого типа)?
В том то и дело, что не хочется так выходить из ситуации, весь смысл шаблонов пропадает
0
Evg
Эксперт CАвтор FAQ
18382 / 6430 / 441
Регистрация: 30.03.2009
Сообщений: 17,850
Записей в блоге: 28
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>" конкретным типом не является
0
Genius Ignat
1237 / 775 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
01.03.2010, 14:58 #28
fasked:
Ни кто лучше автора языка тебе не ответит:
0
Миниатюры
Шаблоны  
CyBOSSeR
Эксперт С++
2305 / 1675 / 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;
}
2
01.03.2010, 16:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2010, 16:48
Привет! Вот еще темы с ответами:

Шаблоны - C++
ругается на строку &quot;friend class List&lt;T&gt;;&quot;, вот что пишет: 1&gt;c:\users\slava\documents\visual studio...

Шаблоны С++ - C++
template &lt;typename T_sizeCapacity&gt; class SomeClass { public: T_sizeCacity size; }; Как сделать чтобы T_sizeCapacity мог быть...

Шаблоны - C++
Не пойму что я неправильно делаю. Как не переделывал, всё равно не получалось. Может кто сможет чем помочь. А задача следующая-надо было...

Шаблоны C++11 - C++
#include &lt;iostream&gt; template&lt;typename T1, typename T2&gt; auto func(T1 a, T2 b) -&gt; decltype(a&gt;b?b:a) { return a&gt;b?b:a; ...


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

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

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