所以我试图将项目中的某些东西导出到DLL。无论如何,一些项目非常重视单例类。
template <typename T>
class DLL_IMP VA_Singleton {
protected:
VA_Singleton () {};
~VA_Singleton () {};
public:
static T *Get(){
return (static_cast<T*> (a_singleton));
}
static void Delete(){
if(a_singleton == NULL) {
delete a_singleton;
}
}
static void Create(){
a_singleton = GetInstance();
if(a_singleton == NULL){
a_singleton = new T;
}
}
private:
static T *a_singleton;
};
template <typename T> T *VA_Singleton<T>::a_singleton = NULL;
我的导出工作正常,但在导入时说明:
template <typename T> T *VA_Singleton<T>::a_singleton = NULL;
不适用于DLLImport。这是我第一次在工作环境中使用DLL。有没有人有任何想法?
答案 0 :(得分:2)
请参阅Multiple Singleton Instances
您必须确保在一个编译单元中完成模板实例化,并且必须将指针= NULL初始化移动到CPP文件。在其他DLL中,您必须使用extern
模板。
修改强> 如果您不得不让模板化的单例在多个DLL上工作,您还可以定义一个返回单例实例的短包装函数,以便模板实例化仅在一个编译单元中完成。
示例:
template class Singleton<T>;
__declspec(dllexport/dllimport) T& getInstanceForMyType();
// in the cpp file:
T& getInstanceForMyType()
{
return Singleton<MyType>::getInstance();
}