Problem polega na kompilacji wieloplokowej
pliki to: klasa.h, klasa.cpp, main.cpp
w klasa.h znajduje się deklaracja klasy szablonowej;
w klasa.cpp jej definicja.
natomiast w main.cpp główny plik programu wykorzystujący tą klase.
Z tego co wyczytałem to problem pojawia się przy linkowaniu, ponieważ kompilator generuje 2x taką samą klasę szablonową osobno dla każdego pliku .cpp i później ma problemy z połączeniem tych plików.
gdy szablon klasy zamienie na zwykłą klasę to działa wszystko poprawnie.
templates+g++
-
- Posty: 45
- Rejestracja: 20 kwietnia 2007, 12:12
Trochę mijacie się z prawdą niestety. Można tak robić ale to się kłóci z zasadą modularności kodu.
W pliku nagłówkowym umieszczamy deklarację klasy szablonowej. A w pliku z definicjami funkcji postępujemy w następujący sposób.
Zakładając oczywiście że wzorzec ma jeden argument. Gwoli ścisłości "template<class T>" musi znaleźć się przed definicją każdej metody w pliku.
W pliku nagłówkowym umieszczamy deklarację klasy szablonowej. A w pliku z definicjami funkcji postępujemy w następujący sposób.
Kod: Zaznacz cały
template<class T>
typ klasa<T>::metoda(T a){
}
Chodzi ci chyba o szablon klasy, a nie klasę szablonową.Trochę mijacie się z prawdą niestety. Można tak robić ale to się kłóci z zasadą modularności kodu.
W pliku nagłówkowym umieszczamy deklarację klasy szablonowej. A w pliku z definicjami funkcji postępujemy w następujący sposób.
Zakładając oczywiście że wzorzec ma jeden argument. Gwoli ścisłości "template<class T>" musi znaleźć się przed definicją każdej metody w pliku.Kod: Zaznacz cały
template<class T> typ klasa<T>::metoda(T a){ }
Nie bardzo cię rozumiem, a jest jakiś inny sposób zdefiniowania metody szablonu klasy poza jej deklaracją bez użycia template<class T> przed jej nazwaą?
tzn?? Dla mnie stsowanie w plikach nagłówkowych sekwencji #ifndef #define #endif to normalarret pisze:1] Owszem może.Immortal pisze:Szablony umieszcza się w plikach nagłółkowych. Całe. Nie możesz dzielić ich na deklarację i definicję. Nawet g++ tutaj nic nie poradzi.
2] Grygus - Dyrektywy preprocesora się kłaniają. #ifndef etc.
ale to nic nie daje. Jedyne czego się doczytałem że należy jakoś użyć dyrektywy #pragma z jakąś informacją dla kompilatora ale nie znalazłem jaką :/