inline
如果模板函数包含在多个cpp
文件中,我是否需要它们?谢谢。
template<bool> inline QString GetText();
template<> inline QString GetText<true>() {return "true";}
template<> inline QString GetText<false>() {return "false";}
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 节说:
仅当使用 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
—结束示例]
似乎模板方法必须在正在构建的同一文件中定义,您不需要使用“内联”关键字,因为它们是在包含它的每个 cpp 文件中构建的。
模板声明没有理由 inline 但模板完全专业化没有理由,您不需要为第一行添加 inline 关键字,但第二和第三行需要它。但是每个使用模板的翻译单元都需要包含模板定义,所以最好的方法是将它包含在头文件中,并包含在其他使用它的cpp中。
在 3.2/6 的 C++ 标准 n3376 中,如果定义相同,则整个应用程序可以有多个类模板的定义。
================
根据 Jesse Good 评论更新答案,(需要内联模板完全专业化)感谢 Jesse Good 指出。