55

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 linked error because Class.cpp never instantiate void Class::function<int>(T). You can explicitly instantiate a template class with :

template class std::vector<int>;

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

Thanks,

JFMR
  • 23,265
  • 4
  • 52
  • 76
TiMoch
  • 1,008
  • 1
  • 10
  • 17
  • I was asking the question in the context this blog post concerning boost's serialization library : http://www.timoch.com/blog/2013/04/boost-serialization-coupling-issue/ – TiMoch Apr 12 '13 at 16:02

2 Answers2

76

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.

Andy Prowl
  • 124,023
  • 23
  • 387
  • 451
6

Have you tried with the following in Class.cpp?

template void Class::function<int>(int value);
JFMR
  • 23,265
  • 4
  • 52
  • 76
Didier Trosset
  • 36,376
  • 13
  • 83
  • 122