У меня есть простой шаблон синглтон-класса, я упростила его, если сохранить просто для чтения (удалены гарантии, утверждения и т. Д. Это не предмет вопроса)
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
}
Если я не определю это, компоновщик выдаст ошибку, которую он не может найти 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 часа с этой проблемой, я не могу найти решение, я погуглил и ищу в StackOverflow, coudln 'Не могу найти аналогичную проблему и решение.
Cheers, Seb