7

如果我在非模板类中有一个成员函数模板并且想在类之外定义它 - 我必须使用“内联”吗?

例子:

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基本上被忽略以进行优化,但允许在不同的翻译单元中定义多个函数,这隐含地转换为将这些函数导出为弱符号。这是否意味着将模板声明为内联是多余的?

4

2 回答 2

0

inline作为关键字,向编译器建议标记为这样的函数是具有相同名称的优化的良好候选者,并且作为实现这种优化的帮助,它要求以相同的方式定义函数- - 在每个使用它的 CU 中(如果编译器看到代码,它更容易进行优化,即使链接器能够进行相同的优化,这在 20 年前并不常见)。

您可能希望为函数模板提供此提示,从而将函数模板定义标记为内联。如果您不想给出该提示,则不需要 inline。

(现在有一段时间只考虑标记为 inline 的函数进行优化,但关键字还没有遇到 的命运register,即通常被编译器忽略,除了它的正式含义是防止获取变量的地址)。

于 2012-10-02T13:36:30.440 回答
0

无论成员函数模板是否是函数模板,它们肯定不是对象或非内联函数,因此不适用单一定义规则。

但它们实际上是函数模板,并且对于不特定于非成员函数模板的标准的其他应用程序来说确实如此。

于 2012-10-02T13:26:41.960 回答