LINUX.ORG.RU

Обясните пример по использованию шаблонов.

 


0

2

https://stackoverflow.com/a/495056/3478155

Код:

// Foo.h

// no implementation
template <typename T> struct Foo { ... };

//----------------------------------------    
// Foo.cpp

// implementation of Foo's methods

// explicit instantiations
template class Foo<int>;
template class Foo<float>;
// You will only be able to use Foo with int or float
Можете написать полный рабочий пример вместе с main и т.д? А я уже буду разбираться.



Последнее исправление: beastie (всего исправлений: 1)

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

С примером ты и правда прифигел, если очень надо - пиши в джоб :)

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

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

FreakMurderer
() автор топика
Ответ на: комментарий от pon4ik

job

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

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

Да скажите , хоть где это писать:template class Foo<int>;

в теле функции или просто в файле. В таком виде и писать, или это ее автор укоротил... Не могу понять этот синтаксис, кучу определений, где в каких файлах , в двух , в трёх это все определять. За что зацепиться , где читать , тупо если буду шаблоны изучать - то там не будет рассмотрен данный специфический код. ..Хз...

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

template class Foo<int>;

Это явное инстанцианирование шаблона. Призывает сгенерировать код этого шаблона в точке этой записи в той самой единице трансляции где эта запись произведена.

Остальное - я бы рекомендовал читать в Джосатис и Вандервуд «Шаблоны c++».

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

Да скажите , хоть где это писать:template class Foo<int>;

template class Foo<int>;

Это просто обьявление класса. В данном случае специализации шаблонного класса. И это самое обьявление заставляет компилятор сгенерировать код для класса Foo со значением шаблонного параметра T = int.

«Сгенерировать код» означает, что компилятор в обьектном файле, который получится из файла .cpp, разместит символы к которым потом линкер сможет подлинковать (связать) обращения к такому шаблонному класу с параметром T = int.

Т.е. например Foo.h:

template <typename T>
struct Foo { void print(const T&); }
Foo.cpp
#include <iostream>

template <typename T>
void Foo::print(const T &value) { std::cout << value << '\n'; }

template class Foo<int>;
template class Foo<float>;
main.cpp
#include "Foo.h"

int main() {
    // OK: линкер нашел символ Foo<int>::print(const int&) в Foo.cpp
    Foo<int>().print(42); 

    // OK: линкер нашел символ Foo<float>::print(const float&) в Foo.cpp
    Foo<float>().print(3.14f); 

    // FAIL: линкер не нашел символа Foo<char>::print(const char&)
    // error: unresolved reference ...
    Foo<char>().print('a');
}

KennyMinigun ★★★★★
()
Последнее исправление: KennyMinigun (всего исправлений: 1)
Ответ на: комментарий от KennyMinigun

Спасибо огромное. Таких людей на руках носить надо!

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