I have a function declared like so:
template <typename T> T read();
and defined like so:
template <typename T> T packetreader::read() { offset += sizeof(T); return *(T*)(buf+offset-sizeof(T)); }
However, when I try to use it in my main() function:
packetreader reader; reader.read<int>();
I get the following error from g++:
g++ -o main main.o packet.o main.o: In function `main': main.cpp:(.text+0xcc): undefined reference to `int packetreader::read<int>()' collect2: ld returned 1 exit status make: *** [main] Error 1
Can anyone point me into the right direction?
You need to use the
exportkeyword. However, I don’t think G++ has proper support, so you need to include the template function’s definition in the header so the translation unit can use it. This is because the<int>‘version’ of the template hasn’t been created, only the<typename T>‘version.’An easy way is to
#includethe .cpp file. However, this can cause problems, e.g. when other functions are in the .cpp file. It will also likely increase the compile time.A clean way is to move your template functions into its own .cpp file, and include that in the header or use the
exportkeyword and compile it separately.More information on why you should try and put template function definitions in its header file (and ignore
exportaltogether).