Search code examples
c++function-templatesexplicit-instantiationc++-templates

How do you explicitly instantiate a member function template?


In Class.h:

class Class {
public:
    template <typename T> void function(T value);
};

In Class.cpp:

template<typename T> void Class::function(T value) {
    // do sth
}

In main.cpp:

#include "Class.h"

int main(int argc, char ** argv) {
    Class a;
    a.function(1);
    return 0;
}

I get a linker error because Class.cpp never instantiates void Class::function<int>(T). You can explicitly instantiate a class template with :

template class std::vector<int>;

How do you explicitly instantiate a member template of a non-template class ?


Solution

  • You can use the following syntax in Class.cpp:

    template void Class::function(int);
    

    The template argument can be omitted because of type deduction, which works for function templates. Thus, the above is equivalent to the following, just more concise:

    template void Class::function<int>(int);
    

    Notice, that it is not necessary to specify the names of the function parameters - they are not part of a function's (or function template's) signature.