0

I get a linker error - unresolved symbol - when using a (specialized) template class from a DLL (Visual Studio 2008 compiler). I tried to use the 'explicit template instantiation' trick described also here in Stackoverflow, but it didn't work. I broke it down to a very simple reproducable example:

I have a dynamic library (DLL) 'MyTemplates.lib' with a header file 'MyTemplates.h' (and a source file 'MyTemplates.cpp' without any code which simply includes this header file) with the following content:

template <class T>
class  A
{
public:
    A()
    { int x = 7; }
 };

template <class T>
class B : public A<T>
{
public:
    B()
    {}
};

// do explicit template instantiation for classes A<int> and B<int>
// macro 'MYTEMPLATES_API' is defined in the usual way as:
//#ifdef MYTEMPLATES_EXPORTS
//  #define MYTEMPLATES_API   __declspec( dllexport ) 
//#else
//  #define MYTEMPLATES_API  __declspec(dllimport) 
//#endif
template class MYTEMPLATES_API A<int>;
template class MYTEMPLATES_API B<int>;

Now i have another dynamic library 'UserLibary' (which links against 'MyTemplates.lib') with the files 'Util.h' and Util.cpp'. The file 'Util.h' is as follows:

#include "MyTemplates.h"

class UserClass
{
public:
    UserClass();
public:
    A<int> bla;
    B<int> blubb;
};

and the content of the file 'Util.cpp' is:

#include "Util.h"

UserClass::UserClass()
{
}

The problem is now that my library 'UserLibrary' does compile well, but it gives two linker errors as follows:

1>Util.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall B<int>::B<int>(void)" (__imp_??0?$B@H@@QAE@XZ) referenced in function "public: __thiscall UserClass::UserClass(void)" (??0UserClass@@QAE@XZ)
1>Util.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall A<int>::A<int>(void)" (__imp_??0?$A@H@@QAE@XZ) referenced in function "public: __thiscall UserClass::UserClass(void)" (??0UserClass@@QAE@XZ)

So the linker can not find the symbols for the default constructors of classes A<int> and B<int>. Why is this possible, and how can i get rid of these linker errors ? I thought that the explict template instantiation of the class A<int> and B<int> (in file 'MyTemplates.h') would solve this, but unfortunately it doesn't seem to help - or am I using it in the wrong way ? My compiler is Visual Studio 2008, operating system is windows 7 64 bit, and code is compiled in 64bit.

user2454869
  • 105
  • 1
  • 11

0 Answers0