Singleton w dll

0

Witam
próbuję dodać klasę Singleton do pliku DLL. Niestety dostaję informację o takim będzie:

error C2491: 'HE::Singleton<T>::~Singleton' : definition of dllimport function not allowed
error C2491: 'HE::Singleton<T>::destroySingleton' : definition of dllimport function not allowed
error C2491: 'HE::Singleton<T>::getSingletonPtr' : definition of dllimport function not allowed
error C2491: 'HE::Singleton<T>::Singleton' : definition of dllimport function not allowed

i nie mam pojęcia gdzie jest błąd. I przy okazji czy wykorzystywanie w programie singletonów to dobry pomysł?

#ifdef DLL_EXPORTS
#define DLL_API _declspec(dllexport)
#else
#define DLL_API _declspec(dllimport)
#endif

//Singleton.h
namespace HE
{

    template<typename T>
    class DLL_API Singleton
    {

    public:
        Singleton();
        virtual ~Singleton();
        static T& getSingleton()
        {
            assert(mpInstance); return (*mpInstance);
        }
        static T* getSingletonPtr();
        static void destroySingleton();

    protected:
        static T* mpInstance;
    };

}
//Singleton.cpp
using namespace HE;

template<typename T> T* Singleton<T>::mpInstance = nullptr;
template<typename T> 
T*  Singleton<T>::getSingletonPtr()
{
    return mpInstance;
}
...
0

Może zdefiniuj ciało tych funkcji? :- )
Co do singletonów, to odpowiedź brzmi - zależy do czego.

0

Mam zdefiniowane ciała. Po prostu nie chciało mi się wszystkiego kopiować. :)

3

Problemem jest DLL_API (AKA: _declspec(dllexport)).
Dla szablonu jest to bezsensu, bo sam szablon nie generuje żadnego kodu ani zmiennych, więc dll-ka nie ma co eksportować!
Jedynie specjalizacja szablonu mogłaby to zrobić!

0

Musisz wygenerować konkretną instancję szablonu. W przypadku takiego generycznego singletonu w bibliotece musisz mieć singelton opakowujący konkretną klasę. Nie da się w bibliotece zamknąć "kodu" szablonu. Szablon musi być i tak znany podczas kompilacji. (Słowo kluczowe export zostało usunięte z C++, tylko jedna implementacja to obsługiwała - EDG)

Nagłówek:

template <typename T>
class DLL_API X {
  // ...
};

extern template class X<int>;

Plik źródłowy:

template class DLL_API X<int>;

Miałem dokładnie taki sam problem (singleton w bibliotece współdzielonej, ogólnie miałem z tym dziwne problemy) i tak go rozwiązałem.

Poza tym u Ciebie getSingletonPtr nie może być w pliku źródłowym, wszystko musi być w pliku nagłówkowym.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0