Being a dll newbie I have to ask the allmighty SO about something.
Say I explicitly instantiate a template class like this:
template class __declspec(dllexport) B<int>;
How do I use import this templated class again?
I've tried the adding the code below in my .cpp file where I want to use B
template class __declspec(dllimport) B<int>;
-
When you instantiate a template fully -- you have a complete type. It is no different from any other types. You need to include the header for
Band also compile-time linking in with alibfile or dynamically load the dll to link to the definition.Have you read this article: http://support.microsoft.com/kb/168958 ?
Here's a brief summary of what I tested (and it worked):
Create a dummy DLL project
- Used the Win32 Console application wizard to generate the dll header/source files called:
template_export_test - Added the following:
file:
template_export_test.h
#ifndef EXP_STL #define EXP_STL #endif #ifdef EXP_STL # define DECLSPECIFIER __declspec(dllexport) # define EXPIMP_TEMPLATE #else # define DECLSPECIFIER __declspec(dllimport) # define EXPIMP_TEMPLATE extern #endif EXPIMP_TEMPLATE template class DECLSPECIFIER CdllTest<int>;
file:
template_export_test.cpp
template<class T> CdllTest<T>::CdllTest(T t) : _t(t) { std::cout << _t << ": init\n"; }
Create the test application
- Use the wizard to create a Win32 Console application called:
driver - Edit the Linker project settings of this project:
- Add to Linker > General > Additional Library Directories: path to
template_export_test.lib - Add to Linker > Input > Additional Dependencies:
template_export_test.lib
- Add to Linker > General > Additional Library Directories: path to
- Include the
template_export_test.hin the main cpp file
#include "c:\Documents and Settings\...\template_export_test.h" using namespace std; int main(int argc, char** argv) { CdllTest<int> c(12); }
- Compile and go!
Nailer : I've tried : extern template class __declspec(dllimport) B; Didn't work. - Used the Win32 Console application wizard to generate the dll header/source files called:
-
It seems, even with explicit instatiation of the template, problems may arise that lead to run-time errors. Take a look at this interesting article to C4251 (especially the "Conclusion").
0 comments:
Post a Comment