Russian Qt Forum
Ноябрь 22, 2024, 18:25
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
С/C++
>
Непонятка с шаблонами.
Страниц: [
1
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Непонятка с шаблонами. (Прочитано 6567 раз)
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
Гость
Re: Непонятка с шаблонами.
«
Ответ #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
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...