What you are trying to do is called explicit instantiation and the correct syntax is following:
template class Example<uint8_t>;
template class Example<uint16_t>;
template class Example<uint32_t>;
If you really need to distinguish the methods into separate files, I would create a file example_instances.cpp
for the code above, just to have it only once in the sources for better manageability. The code would be organized in the following way:
example.h
template <typename T>
class Example
{
public:
void test1();
void test2();
};
example_test1.cpp
#include "example.h"
template <typename T>
void Example::test1()
{
...
}
#include "example_instances.cpp"
example_test2.cpp
#include "example.h"
template <typename T>
void Example::test2()
{
...
}
#include "example_instances.cpp"
If you are discouraged from including .cpp
files, put the instances into a separate header file. However, this one should be included after implementation unlike common header files (explicit instantiation of function template fails (g++)).