templates+g++

Potrzebujesz pomocy z C, C++, perl, python, itp.
grygus
Posty: 7
Rejestracja: 16 grudnia 2007, 22:00

templates+g++

Post 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.
matteuszek
Posty: 45
Rejestracja: 20 kwietnia 2007, 12:12

Post 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
grygus
Posty: 7
Rejestracja: 16 grudnia 2007, 22:00

Post 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ć.
Immortal
Posty: 31
Rejestracja: 11 grudnia 2007, 12:15
Lokalizacja: Kraków

Post 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.
Avilar
Posty: 6
Rejestracja: 13 stycznia 2008, 20:26
Lokalizacja: Toruñ

Post 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.
larret
Posty: 24
Rejestracja: 14 maja 2007, 08:33

Post 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.
grygus
Posty: 7
Rejestracja: 16 grudnia 2007, 22:00

Post 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ą :/
Avilar
Posty: 6
Rejestracja: 13 stycznia 2008, 20:26
Lokalizacja: Toruñ

Post autor: Avilar »

grygus pisze: Chodzi ci chyba o szablon klasy, a nie klasę szablonową.
Tak masz rację trochę źle zrozumiałem pytanie sory ;)
ODPOWIEDZ