LINUX.ORG.RU

вопросы про шаблоны с++ и инстанцирование

 ,


0

1

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

template <typename T>
T tmin(T a, T b) {
    std::cout << "template T" << std::endl;
    return a < b ? a: b;
}
template<> double tmin<double>(double a, double b);// {
    //std::cout << "template double" << std::endl;
    //return a < b ? a: b;
//}
int main(int argc, char** argv) {
    std::cout<< "double: " << tmin<>(5.0, 6.5)<<std::endl;
    std::cout<< "int: " << tmin<>(5, 6)<<std::endl;
    return ( 0 );
}
Вывод:
double: 5
template T
int: 5

Если шаблон инстанцирую без <> после template, то вывод такой:

template T
double: 5
template T
int: 5

В чем разница, объясните пожалуйста?!

И еще, вот тут http://www.linuxtopia.org/online_books/programming_books/c _practical_progra... описывается явная специализация, но специализация со своим телом функции. В примере выше так не получается сделать(закомментил тело в специализации).
Не подскажите почему?
Заранее благодарю за пояснения!

Всё там получается. Похоже где-то старые o-файлы лежат и всё портят (ошибки линкер выдаёт, я полагаю).

Это запрос на инстанциирование:

template double tmin<double>(double a, double b);

Это объявление внешней функции:

template<> double tmin<double>(double a, double b);

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Спасибо за ответ.
Да, ошибки линкера...
Скажите, т.е. инстанцировать нужно без <> после слова template?
А объявлять нужно только в случае, что такое инстанцирование уже определено в другом месте?

kabanchik ()
Ответ на: комментарий от kabanchik

т.е. инстанцировать нужно без <> после слова template?

Да, таков синтаксис чтобы отличить от случаев объявления/определения.

А объявлять нужно только в случае, что такое инстанцирование уже определено в другом месте?

Тоже да, но «другое место» может быть как в заголовочном файле библиотеки так и просто ниже в файле, в случае если одна реализация использует другую.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Ясно, спасибо большое за разъяснения.
Последний вопрос, который хотел выяснить, почему у меня в примере выше по разному вывод был.
Т.е. получается что-то перегрузки tmin в случае, когда шаблон не вызывался?

kabanchik ()
Ответ на: комментарий от kabanchik

Я думаю, что изначально специализация для double просто не содержала этого вывода. А так как использовалась эта «старая» версия при template<> ...;, то в этом и вся причина. Каких-то языковых вещей в этом нет, просто небольшие проблемы со сборкой.

xaizek ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.