I converted a function to a template, and started getting this error. I must not be understanding a limitation of templates. Can someone tell me why this is broken?
I am receiving this error:
Undefined symbols: 'bool foo<int>(int const&, int const&)', referenced from: _main in file1.o ld: symbol(s) not found
When I link the following code. The code is simplified, but still fails. The first file contains:
#include <iostream> template <class T> bool foo (const T&, const T&); int main () { int left = 1; int right = 2; if (foo <int> (left, right)) std::cout << 'foo!' << std::endl; return 0; }
And the second file contains:
template <class T> bool foo (const T& left, const T& right) { return true; }
For the reason Uri gave, template methods are usually defined in the header file. Because yours is a function and not a method of a class, explicitly define it (in the header file which may be included by more than one CPP file) as static or inline.
Put this in your foo.h
Put this in your main.cpp
The cpp code now sees the whole declaration of the template function.
Other solutions are listed here: How can I avoid linker errors with my template functions?