inline template function?

2019-03-14 13:14发布

问题:

Do I need inline template functions if they are included in several cpp files? Thanks.

template<bool> inline QString GetText();
template<> inline QString GetText<true>() {return "true";}
template<> inline QString GetText<false>() {return "false";}

回答1:

You do, because those are full function specializations, and therefore subject to the one-definition rule just like normal functions.



回答2:

Yes, you need the inline specifier there.

The ODR (one-definition rule) states that there must be exactly one definition of a variable, function, class, enum or template. Exceptions relevant for your question are listed in §3.2/5 (C++11) (emphasis mine):

There can be more than one definition of a class type (Clause 9), enumeration type (7.2), inline function with external linkage (7.1.2), class template (Clause 14), non-static function template (14.5.6), static data member of a class template (14.5.1.3), member function of a class template (14.5.1.1), or template specialization for which some template parameters are not specified (14.7, 14.5.5) in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements. [...]

Template specializations for which all parameters are specified (i.e. explicit specializations) are not listed there, and §14.7.3/12 says:

An explicit specialization of a function template is inline only if it is declared with the inline specifier or defined as deleted, and independently of whether its function template is inline. [ Example:

template<class T> void f(T) { /∗ ... ∗/ }
template<class T> inline T g(T) { /∗ ... ∗/ }
template<> inline void f<>(int) { /∗ ... ∗/ }  // OK: inline
template<> int g<>(int) { /∗ ... ∗/ }          // OK: not inline

— end example ]



回答3:

It seem that the template method must be defined in the same file which is building, You don't need to use the 'inline' keyword for they were build in each cpp file which include it.



回答4:

There is no reason for inline for template declaration but not for template full specialization, you don't need to add the inline keyword for the first line but the second and third one need it. But each translation unit, which use the template, need to contains the template definition so the best way is to include it in header file and include in other cpps which use it.

In C++ standard n3376 for 3.2/6, there can be more than one definition of class template for the whole application, given the definition is same.

===============

Update the answere base on Jesse Good comments, (need inline for template full sepcialization) Thanks Jesse Good point out that.