本文首发于我的博客kezunlin.me/post/4ec4ae…,欢迎阅读最新内容!html
how to implement a template class with c++ and export in dll/so c++
模板类必须在header中实现,而不能在cpp中实现,不然做为dll调用进行连接的时候回出错。less
implement template functions in header.ide
ThreadPool.hpost
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_;
};复制代码
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.ui
template <typename T>
struct Foo
{
void doSomething(T param);
};
#include "Foo.cpp" // here复制代码
template <typename T>
void Foo<T>::doSomething(T param)
{
//implementation
}复制代码
Another solution is to keep the implementation separated, and explicitly instantiate all the template instances you'll need:this
// no implementation
template <typename T> struct Foo { ... };复制代码
#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);复制代码