Russian Qt Forum
Ноябрь 22, 2024, 23:24 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятка с шаблонами.  (Прочитано 6570 раз)
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)

Это мои первые попытки использовать шаблоны, может я что-нибудь не так понял о их назначении?
Записан
Вудруф
Гость
« Ответ #1 : Февраль 17, 2006, 15:04 »

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

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

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

 В догонку: при использовании шаблона с разными параметрами создаются *разные* реализации классов/функций. Просто посиди и подумай, на пользу пойдёт...
Записан
sandy
Гость
« Ответ #2 : Февраль 17, 2006, 18:48 »

В общем, понятно. И в Страуструпа заглядывал.
 :?: Можно ли шаблоны запихнуть в либу? - вот что меня интересует.
Вообще-то функцию, которую мне нужно в библиотеку впихнуть, можно сделать перегруженной. Хотелось сэкономить...
Записан
Konstantin
Гость
« Ответ #3 : Февраль 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* .
Чиатй про специализации.
Записан
Вудруф
Гость
« Ответ #4 : Февраль 20, 2006, 07:53 »

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

Пример функции действительно неудачный. Если тебе надо сравнивать только твои классы, то определи конкретную функцию с вызовом виртуальных операторов по указателю на базовый класс, если же ты хочешь сравнивать максимально большое количество типов данных, то придётся тебе забыть об операторах == и >, т.к. в стандартной библиотеке используется только оператор < и вспомнить о специализации для переопределения шаблона на char*. Итого:
if (x < y)
  return -1;
if (y < x)
  return 1;
return 0;
Записан
sandy
Гость
« Ответ #5 : Февраль 20, 2006, 11:37 »

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

Пример функции я выложил чисто теоретический для экономии времени.
Мне нужна функция принимающая аргументы типов int, float, double. Потому, вычитав все Ваши пожелания и мысли, я воспользовался перегрузкой функции для этой реализации.
Спасибо всем.
Записан
kolobok0
Гость
« Ответ #6 : Февраль 21, 2006, 15:49 »

Цитата: "sandy"
...Можно ли шаблоны запихнуть в либу? - вот что меня интересует....


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


с уважением
(круглый)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.112 секунд. Запросов: 21.