我有一个简单的模板单例类,简化了如果保持易于阅读的内容(删除了安全措施,断言等。这不是问题的主题)
template< class T> T* Create();
template <class T>
class CSingleton
{
public:
static T* CreateInstance() { return m_instance = Create<T>(); }
static void DestroyInstance() { delete m_instance;}
protected:
static T* m_instance;
};
如您所见,我使用全局函数T * Create()来创建新指针,因为我的类可能是抽象类。因此,如果我改为这样定义CreateInstance:
static T* CreateInstance() { return m_instance = new T; }
它将产生一个错误,我无法实例化一个抽象类。
因此,这里有一个非常简单的示例会产生错误, 班级:
class MyClass : public CSingleton<MyClass>
{
};
以及我的cpp中的全局函数的定义
template< > MyClass* Create< MyClass >()
{
return nullptr;// just for the compilation demonstration
}
如果我没有定义this,则链接器将输出无法找到Create()的错误,如果我定义了函数,则会出现此错误:
error C2908: explicit specialization; 'T *Create<T>(void)' has already been instantiated
error C2908: with
error C2908: [
error C2908: T=MyClass
error C2908: ]
我在这个问题上停留了2个小时,找不到解决方案,我在Google上搜索并在StackOverflow上搜索,找不到类似的问题和解决方案。
干杯, 塞巴
答案 0 :(得分:0)
所有这些类都在DLL库中,但是仅在构建库时出现编译器/链接错误。
我忘记检查dllimport / dllexport签名。将这些添加到我的Singleton类前面并创建函数可以解决此错误。