Saturday 20 January 2018

c++ - Why do I get "unresolved external symbol" errors when using templates?

style="font-weight: bold;">

Answer



style="font-weight: bold;">

Answer






When I write C++ code
for a class using templates and split the code between a source (CPP) file and a header
(H) file, I get a whole lot of "unresolved external symbol" errors when it comes to
linking the final executible, despite the object file being correctly built and included
in the linking. What's happening here, and how can I fix it?



Answer




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:




  1. include the
    full definition of
    the member function in the
    template's header file
    and not have
    a source file for the
    template,

  2. define all the member functions
    in

    the template's source file as
    "inline"

    (Update: [this does not work on Visual Studio 2017+]),
    or

  3. define the member
    functions in
    the template's source
    with the "export" keyword.
    Unfortunately this
    isn't supported
    by a lot of compilers.
    (Update: href="http://www.parashift.com/c++-faq/separate-template-fn-defn-from-decl-export-keyword.html"
    rel="nofollow noreferrer">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.



No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...