#c++ #шаблоны_с++ #c++_faq
Как вынести метод шаблонного класса из хэдера в cpp ?
Ответы
Ответ 1
Необходимо помнить, что шаблон порождает код класса только тогда, когда вы употребляете этот шаблон в программе с конкретными параметрами. Это означает, что нельзя скомпилировать модуль содержащий просто шаблон класса. Шаблон — это еще не тип (в C#, напротив, угловые скобки говорят о типе Generic). Таким образом, реализация метода должна быть в том модуле, где этот метод используется, иначе получите Unresolved symbol. Вот пример, который скомпилировался в MSVS 2008: foo.h: #pragma once templateclass 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 templateclass 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() { Templtempl(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) { }
Комментариев нет:
Отправить комментарий