【发布时间】:2012-07-17 17:08:44
【问题描述】:
模板类的方法是隐含的inline 链接(不是在谈论内联优化),还是只是模板化的方法?
// A.h
template<typename T>
class A
{
public:
void func1(); // #1
virtual void func2(); // #2
template<typename T2> void func3(); // #3
};
template<typename T>
void A<T>::func1(){} // #1
template<typename T>
void A<T>::func2(){} // #2
template<typename T>
template<typename T2>
void A<T>::func3<T2>(){} // #3
以上情况都是inline【联动】吗? (我应该为其中任何一个明确写inline)吗?
【问题讨论】:
-
如果它们都在头文件中,你应该为它们都写
inline。 -
@user315052 为什么?我认为你不应该标记它们
inline,并让编译器(比你聪明)来决定是否内联。 -
@JonathonReinhart 这涉及内联链接,而不是复制粘贴类型的内联
-
@ildjarn:我很确定模板函数和模板类成员函数在这方面是特殊的,我想出的快速测试似乎表明了这一点。我还没有标准的报价。
-
@Dave:那不是linkage,只是
inline与否。链接影响符号是否在翻译单元中导出,并导出inline函数(可能是,如果不是static并且函数在翻译单元中离线生成)。尝试在两个翻译单元中获取内联函数的地址(这将强制进行行外定义,以防您的编译器默认情况下不这样做),然后检查二进制文件中导出了哪些符号,您将看到那个内联函数。
标签: c++ templates inline linkage