内联模板功能?

use*_*020 24 c++ template-function

inline如果它们包含在多个cpp文件中,我是否需要模板功能?谢谢.

template<bool> inline QString GetText();
template<> inline QString GetText<true>() {return "true";}
template<> inline QString GetText<false>() {return "false";}
Run Code Online (Sandbox Code Playgroud)

Meh*_*dad 25

你这样做,因为它们是全功能专业化,因此就像普通函数一样遵循单一定义规则.

  • 对于模板而不是完全专用的模板,我可以删除`inline`关键字.这样对吗?比如`template <bool> QString GetText();` (3认同)
  • @ user1899020:是的,你可以. (3认同)

jog*_*pan 19

是的,你需要inline那里的说明符.

ODR(单定义规则)规定必须只有一个变量,函数,类,枚举或模板的定义.与您的问题相关的例外情况列于§3.2/ 5(C++ 11)(强调我的):

类类型(第9条),枚举类型(7.2),带内部链接的内联函数(7.1.2),类模板(第14条),非静态函数模板(14.5.6)可以有多个定义,类模板的静态数据成员(14.5.1.3),类模板的成员函数(14.5.1.1),或者在程序中未指定某些模板参数(14.7,14.5.5)的模板特化,前提是每个模板定义出现在不同的翻译单元中,并且定义满足以下要求.[...]

那里没有列出指定所有参数的模板特化(即显式特化),§14.7.3/ 12说:

只有在使用内联说明符声明或定义为已删除时,函数模板的显式特化才是内联的,而与其函数模板是否为内联无关.[例如:

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
Run Code Online (Sandbox Code Playgroud)

- 结束例子]