Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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)?

like image 681
David Avatar asked Jul 17 '12 17:07

David


People also ask

Are templated functions inline?

Yes, they are inline . Most implementations can't do separate instantiation of template functions, so you have to include them in every place you intend to use them.

What is a templated class?

As per the standard definition, a template class in C++ is a class that allows the programmer to operate with generic data types. This allows the class to be used on many different data types as per the requirements without the need of being re-written for each type.

Can a non templated class have a templated member function?

A non-template class can have template member functions, if required. Notice the syntax. Unlike a member function for a template class, a template member function is just like a free template function but scoped to its containing class.


1 Answers

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.

like image 91
David Rodríguez - dribeas Avatar answered Sep 22 '22 07:09

David Rodríguez - dribeas