error C2908: 显式特化; ''已经被实例化

error C2908: explicit specialization; '' has already been instantiated

我有一个简单的模板单例class,我简化了if to keep is simple to read(删除了保护措施,断言等。这不是问题的主题)

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() 来更新指针,因为我的 class 可能是一个抽象 class。所以如果我改为这样定义 CreateInstance :

static  T*      CreateInstance() { return m_instance = new T; }

它会产生一个错误,我无法实例化一个抽象class。

所以这里有一个非常简单的例子,它会产生错误, class :

class MyClass : public CSingleton<MyClass>
{
};

以及我的cpp中全局函数的定义

template< > MyClass* Create< MyClass >()
{
    return nullptr;// just for the compilation demonstration
}

如果我不定义它,链接器将输出找不到 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 个小时,我找不到解决方案,我在 Whosebug 上搜索和搜索,找不到类似的问题和解决方案。

干杯, 塞布

所有这些 class 都在一个 DLL 库中,但我在仅构建库时遇到了编译器/link 错误。

我忘了检查 dllimport/dllexport 签名。在我的 Singleton class 和 Create func 前面添加这些解决了这个错误。