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)?
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.
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.
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.
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With