【发布时间】:2012-09-23 08:10:45
【问题描述】:
如果我在非模板类中有一个成员函数模板并想在类外定义它 - 我必须使用“内联”吗?
例子:
class A
{
template <class D>
void someMethod(D param);
}
template <class D>
/* inline needed here? */ void A::someMethod(D param)
{
}
标准的第 3.2.5 节说函数模板不属于单一定义规则。成员函数模板就是这方面的函数模板吗?
编辑:链接器不会抱怨没有内联 - 但仍然 - 它是有效的 C++03 吗?
编辑:
到目前为止我所学到的:gcc(假设还有其他编译器)将隐式模板实例导出为弱符号,这意味着如果它们在多个翻译单元中实例化,则在链接时不会发生冲突.由于弱符号不是标准的一部分 - 标准是否以某种方式隐含地要求模板实例以这种方式运行,我是否可以期望与其他符合标准的编译器/链接器组合具有相同的行为?
由于 inline 基本上被忽略以进行优化,但允许在不同的翻译单元中定义多个函数,这隐含地转换为将这些函数导出为 weak symbols。这是否意味着将模板声明为 inline 是多余的?
【问题讨论】:
-
是的,编译器不会抱怨。然而,并非所有满足编译器的东西都是有效的 C++ ;) 我们只是在这里进行了讨论,没有人很确定。
-
编译器不会抱怨,因为它一次只能看到一个翻译单元,并且当在两个翻译单元中定义某些内容时会发生 ODR 冲突。
-
inline有什么语法意义吗?我一直以为这只是对编译器的优化建议。 -
@Philipp - 内联有语义;它告诉编译器在不同的翻译单元中对同一个内联函数的多个定义并不违反单一定义规则。它还强加了自己的规则,即所有定义必须相同。
-
只需查看您的 C++ 书籍中的 ODR(一个定义规则),一切都会变得更加清晰。