Stworzyłem szablon klasy obsługującej zbiory (miedzy innymi operacje OR, AND, XOR, DIFF). Klasa ta jest wpełni wirtualna:
#v+
template <class Typ>
class Lista
{
protected:
struct Wezel{ Typ * element; struct Wezel * next; };
Wezel * poczatek;
Wezel * koniec;
void dodaj( const Wezel * );
virtual void usun( const Wezel * ) = 0;
virtual void put( ostream & ) = 0;
virtual void get( istream & ) = 0;
virtual Wezel * wnowy( int, int ) = 0;
virtual Lista * onowy() const = 0;
virtual int wcompare( const Wezel * , const Wezel * );
virtual void wcopy( Wezel *, Wezel * );
public:
Lista(): poczatek(NULL), koniec(NULL) {};
virtual ~Lista();
Lista( const Lista & );
Lista & operator+( const Lista & ) const;
Lista & operator-( const Lista & ) const;
Lista & operator&( const Lista & ) const;
Lista & operator^( const Lista & ) const;
friend ostream & operator<<( ostream &, Lista & );
friend istream & operator>>( istream &, Lista & );
};
#v-
tak to wyglada, oczywiscie metody mam zdefiniowane rowniez w tym samym pliku, i wszystkie raczej działaja poprawnie :) (mam nadzieje)
Postanowilem stowrzyć sobie bazę książek:
typedef struct Book
{
char * autor;
char * tytul;
};
class Books : public Lista<Book>
{
protected:
char * rodzaj;
void usun( const Wezel * );
void put( ostream & );
void get( istream & );
Wezel * wnowy( int tytul, int autor) {
Wezel * nwezel = new Wezel; nwezel -> element = new Book;
nwezel -> element -> tytul = new char[tytul];
nwezel -> element -> autor = new char[autor];nwezel->next = NULL;
return nwezel;}
Lista<Book> * onowy() const { return new Books; }
int wcompare( const Wezel *, const Wezel * );
void wcopy( Wezel *, Wezel * );
public:
Books(): Lista<Book>(){ rodzaj = NULL; };
Books( const Books & lista ):Lista<Book>( lista ) { rodzaj = new char[5]; if( rodzaj == NULL ) return; strcpy( rodzaj, "brak" ); }
~Books();
inline char * show_rodzaj() { return rodzaj; }
};
Wszystko sie kompiluje bez problemu, jednakże podczas linkowania wyskakuje coś takiego:
g++ -ggdb -Wall -Wno-non-template-friend -Wno-deprecated -o zbiory main.o books.o
main.o(.gnu.linkonce.r._ZTV5ListaI4BookE+0x1c):/home/krystian/Projects/Zbiory/src/main.cc:12: undefined reference to Lista<Book>::wcompare(Lista<Book>::Wezel const*, Lista<Book>::Wezel const*)' main.o(.gnu.linkonce.r._ZTV5ListaI4BookE+0x20):/home/krystian/Projects/Zbiory/src/main.cc:12: undefined reference to
Lista<Book>::wcopy(Lista<Book>::Wezel*, Lista<Book>::Wezel*)'
collect2: ld returned 1 exit status
make: *** [zbiory] Błąd 1
Nie umiem sobie z tym poradzić. Czy ktoś moglby udzielić mi jakiejść wskazówki ?
Przepraszam za obszerność tego postu, ale zależało mi by być dokładnym.
Pozdrawiam
Krystian