Templated classes and functions are not instantiated until they are used, typically in a separate .cpp file (e.g. the program source). When the template is used, the compiler needs the full code for that function to be able to build the correct function with the appropriate type. However, in this case the code for that function is detailed in the template's source file and hence unavailable.
As a result of all this the compiler just assumes that it's defined elsewhere and only inserts the call to the templated function. When it comes to compile the template's source file, the specific template type that is being used in the program source isn't used there so it still won't generate the code required for the function. This results in the unresolved external symbol.
The solutions available for this are to:
- include the full definition of
the member function in the
template's header file and not have
a source file for the template,
- define all the member functions in
the template's source file as
"inline" (Update: [this does not work on Visual Studio 2017+]), or
- define the member
functions in the template's source
with the "export" keyword.
Unfortunately this isn't supported
by a lot of compilers. (Update: this has been removed from the standard as of C++11.)
Both 1 and 2 basically address the problem by giving the compiler access to the full code for the templated function when it is attempting to build the typed function in the program source.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…