内联模板函数

inline template function?

本文关键字:函数      更新时间:2023-10-16

如果inline模板函数包含在多个cpp文件中,是否需要它们?谢谢

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

确实如此,因为这些都是全函数专业化,因此与普通函数一样,也要遵守一个定义规则。

是的,您需要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

--结束示例]

没有内联模板声明的理由,但没有内联模板完全专业化的理由,您不需要为第一行添加内联关键字,但第二行和第三行需要它。但是使用模板的每个翻译单元都需要包含模板定义,所以最好的方法是将其包含在头文件中,并包含在使用它的其他cpp中

在3.2/6的C++标准n3376中,如果定义相同,则整个应用程序可以有多个类模板定义。

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

根据Jesse Good的评论更新ansare,(需要内联模板完全个性化)感谢Jesse古德指出这一点。

模板方法似乎必须在正在构建的同一个文件中定义,您不需要使用'inline'关键字,因为它们是在包含它的每个cpp文件中构建的。