
正文
如何在动态链接库dll/so中导出自定义的模板类template class | how to implement a template class with c++ and export in dll/so
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
本文首发于个人博客https://kezunlin.me/post/4ec4ae49/,欢迎阅读最新内容!
how to implement a template class with c++ and export in dll/so
Guidequestions模板类必须在header中实现,而不能在cpp中实现,否则作为dll调用进行链接的时候回出错。
common solutions(Recommend)implement template functions in header.
模板类必须在header中实现,而不能在cpp中实现,否则作为dll调用进行链接的时候回出错。
common solutions(Recommend)implement template functions in header.
implement template functions in header.
ThreadPool.h
class SHARED_EXPORT ThreadPool {
public:
static ThreadPool* Instance(size_t max_thread_pool_size);
~ThreadPool(); // Add new work item to the pool.
template<class F>
inline void Enqueue(F f)
{
io_service_.post(f);//sync, return immediately
}void Free();private:
static std::shared_ptr<ThreadPool> m_pInstance;
bool bfree;ThreadPool(size_t size);
DISABLE_COPY_AND_ASSIGN(ThreadPool);boost::thread_group workers_;
boost::asio::io_service io_service_;
boost::asio::io_service::work work_;
};
Seperate from headerssolutions 1A common solution to this is to write the template declaration in a header file, then implement the class in an implementation file (for example .tpp), and include this implementation file at the end of the header.
Foo.h
A common solution to this is to write the template declaration in a header file, then implement the class in an implementation file (for example .tpp), and include this implementation file at the end of the header.
Foo.h
template <typename T>
struct Foo
{
void doSomething(T param);
};#include "Foo.cpp" // here
Foo.cpp
template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}
solutions 2
Another solution is to keep the implementation separated, and explicitly instantiate all the template instances you'll need:
Foo.h
// no implementation
template <typename T> struct Foo { ... };
Foo.cpp
#include "Foo.h"// implementation of Foo's methods// explicit instantiations
template class Foo<int>;
template class Foo<float>;
// You will only be able to use Foo with int or float// template void TestClass::templateFunction<int, int>(int, int);
Reference- why-can-templates-only-be-implemented-in-the-header-file
- separate-c-template-headers-h-and
- Cpp_template_definitions_in_a_cpp_file_instead_of_header
History- 20191012: created.
Copyright- Post author: kezunlin
- Post link: https://kezunlin.me/post/4ec4ae49/
- Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.
- 20191012: created.





