如果它们包含在多个inline
文件中,是否需要cpp
模板功能?感谢。
template<bool> inline QString GetText();
template<> inline QString GetText<true>() {return "true";}
template<> inline QString GetText<false>() {return "false";}
答案 0 :(得分:22)
你这样做,因为它们是完整的功能特化,因此就像普通函数一样遵循单一定义规则。
答案 1 :(得分:15)
是的,那里需要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
- 结束示例]
答案 2 :(得分:0)
没有理由内联模板声明但不能用于模板完全专业化,您不需要为第一行添加inline关键字,但第二行和第三行需要它。 但是每个使用模板的翻译单元都需要包含模板定义,因此最好的方法是将其包含在头文件中,并包含在使用它的其他cpp中。
在C ++标准n3376 for 3.2 / 6中,对于整个应用程序,可以有多个类模板定义,因为定义相同。
===============
根据Jesse Good评论更新回答基础(需要内联模板完全特殊化)感谢Jesse Good指出。
答案 3 :(得分:0)
似乎必须在构建的同一文件中定义模板方法,您不需要使用'inline'关键字,因为它们是在包含它的每个cpp文件中构建的。