Strona 1 z 1

templates+g++

: 31 grudnia 2007, 21:55
autor: grygus
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.

: 01 stycznia 2008, 23:39
autor: matteuszek
A czy nie jest tak że szablon klasy w c++ pisze się tylko w pliku nazwa_klasy.hpp ? nie robi się oddzielnie 2 plików .hpp i .cpp

: 03 stycznia 2008, 13:09
autor: grygus
Najwyraźniej tak musi być, dzięki wielkie. W Borland C++ builder jest podobno jakaś opcja inteligętnego linkowania na wypadek szablonów, myślałem, że bezpośrednio w g++ da się coś takiego zrobić.

: 04 stycznia 2008, 23:56
autor: Immortal
Szablony umieszcza się w plikach nagłółkowych. Całe. Nie możesz dzielić ich na deklarację i definicję. Nawet g++ tutaj nic nie poradzi.

: 13 stycznia 2008, 20:34
autor: Avilar
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.

Kod: Zaznacz cały

    template<class T>
    typ klasa<T>::metoda(T a){

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

: 13 stycznia 2008, 23:27
autor: larret
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.
1] Owszem może.
2] Grygus - Dyrektywy preprocesora się kłaniają. #ifndef etc.

: 13 stycznia 2008, 23:54
autor: grygus
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.

Kod: Zaznacz cały

    template<class T>
    typ klasa<T>::metoda(T a){

    }
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.
Chodzi ci chyba o szablon klasy, a nie klasę szablonową.

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ą?
larret pisze:
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.
1] Owszem może.
2] Grygus - Dyrektywy preprocesora się kłaniają. #ifndef etc.
tzn?? Dla mnie stsowanie w plikach nagłówkowych sekwencji #ifndef #define #endif to norma
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ą :/

: 14 stycznia 2008, 16:46
autor: Avilar
grygus pisze: Chodzi ci chyba o szablon klasy, a nie klasę szablonową.
Tak masz rację trochę źle zrozumiałem pytanie sory ;)