ошибка C2908: явная специализация;'' уже был создан - PullRequest
0 голосов
/ 19 июня 2019

У меня есть простой шаблон синглтон-класса, я упростила его, если сохранить просто для чтения (удалены гарантии, утверждения и т. Д. Это не предмет вопроса)

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

1 Ответ

0 голосов
/ 19 июня 2019

Все эти классы находятся в библиотеке DLL, но я получил ошибку компилятора / ссылки при сборке только библиотеки.

Я забыл проверить подписи dllimport / dllexport. Добавление тех, кто находился перед моим классом Singleton и Create func, решило эту ошибку.

...