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

Popular posts from this blog

twig - Using Twigbridge in a Laravel 5.1 Package -

jdbc - Not able to establish database connection in eclipse -

Kivy: Swiping (Carousel & ScreenManager) -