内联模板函数
inline template function?
如果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文件中构建的。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗