Exportowanie klasy używającej kontener stl.

Exportowanie klasy używającej kontener stl.
pylaochos
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 86
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:

Kopiuj
 
#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:

Kopiuj
MOGE_EXPORT

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

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

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

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

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

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

Teraz to nie działa. Wyskakuje error:

Kopiuj
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

Kopiuj
axisValue

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

Kopiuj
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.

kq
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Szczecin
2

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

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.