Szablony klasy - coś nie tak z metodami

0

Witam,
W ramach nauki programowania obiektowego postanowiłem napisać własną listę. Udało mi się tego dokonać, ale na razie tylko dla konkretnego typu danych (int). Chciałbym umieć wykonać taką listę również dla niesprecyzowanego z góry typu ( czyli krótko mówiąc zrobić jej szablon).

Kod działającej listy dla int:

#include <iostream>

using namespace std;

class cPart;
class cList;

class cList
{
	private:
		int m_size;
		cPart* m_first;
		cPart* m_last;
		cPart* m_nothing;
	public:
		cList();
		~cList();
		int size(){ return m_size; }
		void size_up(){ m_size++; }
		void size_down(){ m_size--; }
		cPart* nothing(){ return m_nothing; }
		cPart* first(){ return m_first; }
		cPart* last(){ return m_last; }
		void set_first(cPart* pointer) { m_first = pointer; }
		void set_last(cPart* pointer) { m_last = pointer; }
		inline cPart* set_pointers(cPart*); 

//--- metody właściwe
		void push_f(int);
		//void push_b(int);
		//void insert(int);	
};

class cPart
{
	private:
		cPart* m_next;
		cPart* m_previous;
		int m_value;
	public:
		cPart(int value);
		//~cPart();
		cPart* next(){ return m_next; }
		cPart* previous(){ return m_previous; }
		int value(){ return m_value; }
		void set_next(cPart* pointer){ m_next = pointer; }
		void set_previous(cPart* pointer){ m_previous = pointer; }
		void set_value(int value){ m_value = value; }
		cPart* pointer(){ return this; }
};

//------------ metody cList
cList::cList()
{
	m_nothing = new cPart(0);
	m_first = m_last = m_nothing;
}

cList::~cList()
{
	;//clear();
	delete m_nothing;
}

inline cPart* cList::set_pointers(cPart* pointer)
{
	pointer->set_next( nothing() );
	pointer->set_previous( nothing() );
	return pointer;
}

void cList::push_f(int value)
{
	cPart* pointer = set_pointers( new cPart(value) );

	if(size() == 0) set_last(pointer);
	
	if(m_first != m_nothing )
	{
		pointer->set_previous(m_first);
		m_first->set_next(pointer);
	}

	m_first = pointer;
	size_up();
}

//------------- metody cPart

cPart::cPart(int value)
{
	m_value = value;
	//m_next = m_previous = this;
}

A to jest to co próbowałem zamienić na szablon ( klasa cPart nie posiada wszystkich metod - bo na razie chodzi mi o to, żeby się to skompilowało):

#include <iostream>

using namespace std;

template<typename TYPE>class cPart;
template<typename TYPE>class cList;


template<typename TYPE>class cList
{
	private:
		int m_size;
		cPart<TYPE>* m_first;
		cPart<TYPE>* m_last;
		cPart<TYPE>* m_nothing;
	public:
		cList();
		~cList();
		int size(){ return m_size; }
		void size_up(){ m_size++; }
		void size_down(){ m_size--; }
		cPart<TYPE>* nothing(){ return m_nothing; }
		cPart<TYPE>* first(){ return m_first; }
		cPart<TYPE>* last(){ return m_last; }
		void set_first(cPart<TYPE>* pointer) { m_first = pointer; }
		void set_last(cPart<TYPE>* pointer) { m_last = pointer; }
		inline cPart<TYPE>* set_pointers(cPart<TYPE>*); 

//--- metody właściwe
// 		void push_f(int);
};

template<typename TYPE>class cPart
{
	private:
		TYPE m_value;
	public:
		TYPE value() { return m_value; } 
};



//------------ metody cList
cList::cList()
{
	m_nothing = new cPart(0);
	m_first = m_last = m_nothing;
}

cList::~cList()
{
	//clear();
	delete m_nothing;
}

inline cPart* cList::set_pointers(cPart<TYPE>* pointer)
{
	pointer->set_next( nothing() );
	pointer->set_previous( nothing() );
	return pointer;
}

Konkretnie ( jak widać przy kompilacji) chodzi mi o te 3 ostatnie metody. Długo się męczyłem, żeby to działało i niestety nic z tego... :P

Czy ktoś mógłby mi pomóc?

Pozdrawiam

PS.
Poniżej jeszcze kod pliku do "obsługi" listy (int'owej)

#include "list.h"

int main()
{

	cList lista;

	for(int i = 0; i < 10; i++)
	{
		lista.push_f(i);
	}	


	for(cPart* iterator = lista.first(); iterator != list.nothing(); iterator = iterator->next() )
	{
		cout << iterator->value() << endl;
	}

}
0
template<typename TYPE>class cPart;
template<typename TYPE>class cList;

Po co to? Wystarczy, że zrobisz tak:

template<typename TYPE> class cPart
{
	...
};


template<typename TYPE> class cList
{
	...
};

Konkretnie ( jak widać przy kompilacji) chodzi mi o te 3 ostatnie metody

template<typename TYPE> cList<TYPE>::cList()
{
        m_nothing = new cPart<TYPE>(0);
        m_first = m_last = m_nothing;
}

template<typename TYPE> cList<TYPE>::~cList()
{
        delete m_nothing; //<--- ????
}

template<typename TYPE> inline cPart<TYPE>* cList<TYPE>::set_pointers(cPart<TYPE>* pointer)
{
        pointer->set_next( nothing() );
        pointer->set_previous( nothing() );
        return pointer;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1