39

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

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

4 回答 4

40

你这样做,因为它们是全功能特化,因此像普通函数一样受单一定义规则的约束。

于 2013-07-16T02:43:44.787 回答
24

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

仅当使用 inline 说明符声明或定义为已删除时,函数模板的显式特化才是内联的,并且与其函数模板是否内联无关。[ 例子:

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

—结束示例]

于 2013-07-16T02:57:02.477 回答
0

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

于 2013-07-16T02:49:02.373 回答
0

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

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

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

根据 Jesse Good 评论更新答案,(需要内联模板完全专业化)感谢 Jesse Good 指出。

于 2013-07-16T02:42:12.190 回答