Search code examples
c++templatesinlinelinkage

Are methods of templated classes implied inline linkage?


Are methods of templated classes implied inline linkage (not talking about the inline optimization), or is it just templated methods which are?

// 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

Are all the above cases inline [linkage]? (Should I explicitly write inline for any of them)?


Solution

  • Template functions and member functions of template classes are implicitly inline1 if they are implicitly instantiated, but beware template specializations are not.

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

    By lack of a better quote:

    A non-exported template must be defined in every translation unit in which it is implicitly instantiated (14.7.1), unless the corresponding specialization is explicitly instantiated (14.7.2) in some translation unit; no diagnostic is required


    1 Only in the sense that multiple definitions are allowed for them, but not for optimization purpopses. You can manually mark them inline as a hint for the optimizer.

    See [basic.def.odr]/13.4 - the templates by themselves are excempt from ODR, not because they're implicitly inline.