c++ - Why can templates only be implemented in the header file? -
quote the c++ standard library: tutorial , handbook:
the portable way of using templates @ moment implement them in header files using inline functions.
why this?
(clarification: header files not only portable solution. convenient portable solution.)
it not necessary put implementation in header file, see alternative solution @ end of answer.
anyway, reason code failing that, when instantiating template, compiler creates new class given template argument. example:
template<typename t> struct foo { t bar; void dosomething(t param) {/* stuff using t */} }; // somewhere in .cpp foo<int> f;
when reading line, compiler create new class (let's call fooint
), equivalent following:
struct fooint { int bar; void dosomething(int param) {/* stuff using int */} }
consequently, compiler needs have access implementation of methods, instantiate them template argument (in case int
). if these implementations not in header, wouldn't accessible, , therefore compiler wouldn't able instantiate template.
a common solution write template declaration in header file, implement class in implementation file (for example .tpp), , include implementation file @ end of header.
// foo.h template <typename t> struct foo { void dosomething(t param); }; #include "foo.tpp" // foo.tpp template <typename t> void foo<t>::dosomething(t param) { //implementation }
this way, implementation still separated declaration, accessible compiler.
another solution keep implementation separated, , explicitly instantiate template instances you'll need:
// 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>; // able use foo int or float
if explanation isn't clear enough, can have @ c++ super-faq on subject.
Comments
Post a Comment