Russian Qt Forum

Программирование => С/C++ => Тема начата: sandy от Февраль 17, 2006, 13:05



Название: Непонятка с шаблонами.
Отправлено: sandy от Февраль 17, 2006, 13:05
Пример:
 :arrow: funco.h
template <typename T> extern int cmp(T,T);

 :arrow: funco.cpp
#include "funco.h"

template <typename T> int cmp(T x, T y)
{
   if (x<y) return -1;
   if (x==y) return 0;
   if (x>y) return 1;
}

 :arrow: main.cpp
#include <stdio.h>
#include "funco.h"

int main()
{
   printf("%d\n",cmp(1,2));
   return 0;
}


 :!: При сборке ругается:
unredolved external int  cmp<int>(int ,int)

Это мои первые попытки использовать шаблоны, может я что-нибудь не так понял о их назначении?


Название: Непонятка с шаблонами.
Отправлено: Вудруф от Февраль 17, 2006, 15:04
Шаблоны не получится запихнуть в cpp-файл так, как ты это пытаешься. При использовании шаблона компилятор должен знать его структуру...
Соответственно место шаблона - в h файле...

Захочешь подробнее - отпишись, но можешь просто заглянуть в Страуструпа...

добавлено спустя 9 минут:

 В догонку: при использовании шаблона с разными параметрами создаются *разные* реализации классов/функций. Просто посиди и подумай, на пользу пойдёт...


Название: Непонятка с шаблонами.
Отправлено: sandy от Февраль 17, 2006, 18:48
В общем, понятно. И в Страуструпа заглядывал.
 :?: Можно ли шаблоны запихнуть в либу? - вот что меня интересует.
Вообще-то функцию, которую мне нужно в библиотеку впихнуть, можно сделать перегруженной. Хотелось сэкономить...


Название: Re: Непонятка с шаблонами.
Отправлено: Konstantin от Февраль 19, 2006, 15:53
Цитата: "sandy"


template <typename T> int cmp(T x, T y)
{
   if (x<y) return -1;
   if (x==y) return 0;
   if (x>y) return 1;
}
 :!: При сборке ругается:
unredolved external int  cmp<int>(int ,int)

Это мои первые попытки использовать шаблоны, может я что-нибудь не так понял о их назначении?


Правильно человек говорит,определение только в заголовнике.И я не думаю что это нужно пхать в либы.
Ибо это ещё не конечный код функции/класса,он генерируется при вызове с конкретными параметрами.

Насчёт твоей функции.
Как ты собираешься ей сравнивать например char* .
Чиатй про специализации.


Название: Непонятка с шаблонами.
Отправлено: Вудруф от Февраль 20, 2006, 07:53
Чуть поподробнее про специализацию...
Конкретную реализацию с конкретными типами параметров действительно можно переопределить, т.е. есть шаблон и есть его версия именно для этих параметров. Именно так сделаны std::limits . Но запихнуть шаблон в либу не удастся, потому как компилятор не сможет засунуть туда *бесконечное* число реализаций класса/функции для бесконечного параметра.
Насчёт конкретной реализации - не знаю, может быть и получится... Вроде ничего не мешает... Попробуй.

Пример функции действительно неудачный. Если тебе надо сравнивать только твои классы, то определи конкретную функцию с вызовом виртуальных операторов по указателю на базовый класс, если же ты хочешь сравнивать максимально большое количество типов данных, то придётся тебе забыть об операторах == и >, т.к. в стандартной библиотеке используется только оператор < и вспомнить о специализации для переопределения шаблона на char*. Итого:
if (x < y)
  return -1;
if (y < x)
  return 1;
return 0;


Название: Непонятка с шаблонами.
Отправлено: sandy от Февраль 20, 2006, 11:37
Пример функции действительно неудачный. Если тебе надо сравнивать только твои классы, то определи конкретную функцию с вызовом виртуальных операторов по указателю на базовый класс, если же ты хочешь сравнивать максимально большое количество типов данных, то придётся тебе забыть об операторах == и >, т.к. в стандартной библиотеке используется только оператор < и вспомнить о специализации для переопределения шаблона на char*.

Пример функции я выложил чисто теоретический для экономии времени.
Мне нужна функция принимающая аргументы типов int, float, double. Потому, вычитав все Ваши пожелания и мысли, я воспользовался перегрузкой функции для этой реализации.
Спасибо всем.


Название: про шаблоны...
Отправлено: kolobok0 от Февраль 21, 2006, 15:49
Цитата: "sandy"
...Можно ли шаблоны запихнуть в либу? - вот что меня интересует....


запихнуть в либу мона... но стоит это делать лишь в том случае, когда сама либа юзает (или стандартизирует) некий интерфейс. В других случаях - не стоит.


с уважением
(круглый)