错误C2908:显式专业化; ''已被实例化

时间:2019-06-19 08:35:28

标签: c++ templates instantiation specialization

我有一个简单的模板单例类,简化了如果保持易于阅读的内容(删除了安全措施,断言等。这不是问题的主题)

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上搜索,找不到类似的问题和解决方案。

干杯, 塞巴

1 个答案:

答案 0 :(得分:0)

所有这些类都在DLL库中,但是仅在构建库时出现编译器/链接错误。

我忘记检查dllimport / dllexport签名。将这些添加到我的Singleton类前面并创建函数可以解决此错误。