8

模板类的方法是隐含的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吗)?

4

1 回答 1

15

如果模板类的模板函数和成员函数被隐式实例化,则它们是隐式内联1,但要注意模板特化不是。

template <typename T>
struct test {
    void f();
}
template <typename T>
void test<T>::f() {}           // inline

template <>
void test<int>::f() {}           // not inline

由于缺乏更好的报价:

必须在隐式实例化 (14.7.1) 的每个翻译单元中定义非导出模板,除非在某个翻译单元中显式实例化相应的特化 (14.7.2);不需要诊断


1仅在允许对它们进行多个定义的意义上,而不是出于优化目的。您可以手动将它们标记inline为优化器的提示。

请参阅[basic.def.odr]/13.4- 模板本身不受 ODR 影响,而不是因为它们隐含inline.

于 2012-07-17T17:14:36.827 回答