Exportowanie klasy używającej kontener stl.

0

Cześć,

Dzisiaj chciałbym was zapytać co począć z fantem.
Problem wygląda następująco:

  • Zdefiniowałem sobie klasę która zawiera wektor stl, którego element jest nie znanego typu (klasa szablonowa).
  • Klasę chcę exportować, ma być częścią silnika geometrii (do dll).

W hederze odpowiedzialnym za sterowanie exportem mam:

 
#ifdef MOGE_EXPORT
#define MOGE_API __declspec(dllexport)
#define MOGE_API_TEMPLATE
#else
#define MOGE_API __declspec(dllimport)
#define MOGE_API_TEMPLATE extern
#endif

W projekcie silnika mam dodaną definicję preprocesora:

MOGE_EXPORT

Co do klasy którą chccę exportować, jej deklaracja:

        template <typename Type>
	class MOGE_API Point
	{
	public:
        ...

Zmienna która w zasadzie powoduje errory (member tej klasy):

        private:
		std::vector<Type> axisValue;
	};

Wcześniej sobie dawalem radę dodając coś w stylu:

template <typename Type> class MOGE_API std::vector<Type>;

Teraz to nie działa. Wyskakuje error:

error C2079: 'Moge::Point<Type>::axisValue' uses undefined class 'std::vector<Type,std::allocator<_Ty>>'

wskazując na linjkę którą podałem wyżej, z deklaracją zmiennej

axisValue

.
Czy można inaczej eksportować taką klasę? Jednym z rozwiązań jest użycie pointerów, tzn., że zamieniam zmienną

axisValue

na pointera i wszystko bangla.
Ale wolałbym raczej nie korzystać z nich kiedy jest inne rozwiązanie.
Używam visuala 2015 w wersji enterprise, mój OS to win 7.

2

Nie możesz eksportować szablonu. Szablon to nie klasa. Możesz eksportować konkretne konkretyzacje.

2

statyczna dynamiczna nie ma tu nic do rzeczy. Szablon to tylko wzorzec kodu, a nie sam kod, ergo nie da się go normalnie zamieścić w bibliotece lib albo dll.
Kod generowany jest dopiero jak szablon jest użyty - gdy jest konkretyzowany przez kompilator.
W takim wypadku są możliwe trzy wyjścia

  1. w bibliotece wypisać wszystkie konkretyzacje szablonu (najczęściej jest to mało praktyczne) - tak ci odpisał @kq
  2. umieścić cały kod w szablonu w nagłówku, który jest dostarczany z biblioteką
  3. napisać szablon w sposób mieszany (np klasa bazowa działająca na wskaźniku void, oraz szablon pochodny do tej klasy, który opakowuje ten wskaźnik na wskaźnik dowolnego typu) - wymaga to więcej umiejętności i świadomości jak działa kompilator

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