Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Вынести метод шаблонного класса в .cpp

#c++ #шаблоны_с++ #c++_faq


Как вынести метод шаблонного класса из хэдера в cpp ?    


Ответы

Ответ 1



Необходимо помнить, что шаблон порождает код класса только тогда, когда вы употребляете этот шаблон в программе с конкретными параметрами. Это означает, что нельзя скомпилировать модуль содержащий просто шаблон класса. Шаблон — это еще не тип (в C#, напротив, угловые скобки говорят о типе Generic). Таким образом, реализация метода должна быть в том модуле, где этот метод используется, иначе получите Unresolved symbol. Вот пример, который скомпилировался в MSVS 2008: foo.h: #pragma once template class Foo { public: T bar(T a) const; }; main.cpp #include "foo.h" template T Foo::bar(T a) const { return a; } int main(int argc, char *argv[]) { Foo a; int b = a.bar(3); return 0; } Очевидно, в данном примере это равносильно варианту, когда реализация метода расположена в заголовочном файле. А вообще, если у Вас возникла такая задача, стоит задуматься, на верном ли Вы пути, так сказать :)

Ответ 2



Если Вам известно с какими типами будет инстанцироватся данный метод к шаблонном классе, то можно вынести эти специализации. Например, вот так: foo.h #pragma once template class Foo { public: T bar(T a) const; }; foo.cpp template<> int Foo::bar(int a) const { return a; } main.cpp #include "foo.h" int main(int argc, char *argv[]) { Foo a; int b = a.bar(3); return 0; } При этом, инстанцирование (точнее говоря вызов метода bar) с любым другим типом отличным от int будет приводить к ошибке.

Ответ 3



Вот очень элегантный метод, сам юзал: http://www.gamedev.ru/code/tip/?id=5303 // main.cpp #include "Templ.h" int main() { Templ templ(0); Templ templF(0.0f); Templ templD(0.0); return 0; } // Templ.h #pragma once template class Templ { public: Templ(T t); private: T x; }; // Templ.cpp #include "Templ.h" template Templ; template Templ; template Templ::Templ(T t) : x(t) { }

Комментариев нет:

Отправить комментарий