Название: Непонятка с шаблонами. Отправлено: 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" ...Можно ли шаблоны запихнуть в либу? - вот что меня интересует.... запихнуть в либу мона... но стоит это делать лишь в том случае, когда сама либа юзает (или стандартизирует) некий интерфейс. В других случаях - не стоит. с уважением (круглый) |