[visual c++ 2008] problem z szablonem

0

Witam, mam problem ze skompilowaniem następującego kodu:

template <typename T>
BinTreeT::Wezel * BinTreeT<T>::WyszukajWezel(Wezel * lp_inW, T & T_inT)
{
	if (lp_inW != 0)
		if (lp_inW->mT_wartosc == T_inT)
			return lp_inW;
		else if (lp_inW->mT_wartosc >= T_inT)
			return WyszukajWezel(lp_inW->mlp_lewaGalaz, T_inT);
		else
			return WyszukajWezel(lp_inW->mlp_prawaGalaz, T_inT);
	return 0;
}

gdzie definicja klasy BinTreeT:

template <typename T> class BinTreeT
{
public:
	BinTreeT(void);
	BinTreeT(T & T_inT);
	~BinTreeT(void);	
private:
	// klasa zawierajaca pozycje drzewa i wskazniki
	class Wezel {
	public:
		T mT_wartosc;
		Wezel * mlp_lewaGalaz;
		Wezel * mlp_prawaGalaz;
		Wezel(T & T_inT) : mT_wartosc(T_inT), mlp_lewaGalaz(0), mlp_prawaGalaz(0) {}
	};
		// korzen drzewa binarnego
	Wezel * mlp_korzen;

	// liczba niepustych wezlow
	long mn_liczbaWezlow;
public:
	// symuluje alokacje pamieci na nowy wezel
	bool PelneDrzewo(void);
	// dodaje element do drzewa
	void DodajWezel(T & T_inT);
	// sprawdza, czy liczba elementow jest wieksza niz 0
	bool PusteDrzewo(void);
private:
	// funkcja dla potrzeb wewnetrznych - ulatwia usuwanie elementow z drzewa
	std::pair<Wezel*,Wezel*> PozycjaWezla(T & T_inT);
	// zwraca wskaznik do odnalezionego wezla lub NULL
	Wezel * WyszukajWezel(Wezel * lp_inW, T & T_inT);
public:
	// usuwa wezel
	void UsunWezel(T & T_inT);
};

Klasa jest niepełna (jeszcze), a kompilator zgłasza błąd w linijceBinTreeT::Wezel * BinTreeT<T>::WyszukajWezel(Wezel * lp_inW, T & T_inT) Treść jego:

error C2955: 'BinTreeT' : use of class template requires template argument list (...) see declaration of 'BinTreeT'

Próbowałem różnie poprawić tę linijkę, ale najmniej błędów mi się pojawiało, gdy napisałem ją jak wyżej.
Proszę o pomoc.

0

blad masz trywialny, musiales po prostu przeoczyc:

BinTree to template, wiec gdziekolwiek wystepuje, kompilator wymaga podania typow.
btw. inna sprawa, ze jeszcze uzywasz Wezel bez kwalifikatora co tez moze sie niepodobac jesli wystapi kolizja nazw z innym symbolem..

zamien:

template <typename T>
BinTreeT::Wezel * BinTreeT<T>::WyszukajWezel(Wezel * lp_inW, T & T_inT)

na:

template <typename T>
BinTreeT<T>::Wezel * BinTreeT<T>::WyszukajWezel(BinTreeT<T>::Wezel * lp_inW, T & T_inT)
0

Poprawiłem funkcję, jak napisałeś i teraz mam następujące komunikaty (ta sama linijka):

warning C4346: 'BinTreeT<T>::Wezel' : dependent name is not a type
1> prefix with 'typename' to indicate a type
error C2143: syntax error : missing ';' before '*'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
fatal error C1903: unable to recover from previous error(s); stopping compilation

0

a nie

template <typename T>
typename BinTreeT<T>::Wezel * BinTreeT<T>::WyszukajWezel(typename BinTreeT<T>::Wezel * lp_inW, T & T_inT)

przypadkiem?

0

Teraz pokazało mi:

1>ogolny.obj : error LNK2019: unresolved external symbol "public: __thiscall BinTreeT<int>::BinTreeT<int>(void)" (??0?$BinTreeT@H@@QAE@XZ) referenced in function _main
1>C:\Documents and Settings\q\Moje dokumenty\Visual Studio 2008\Projects\my_binary_tree_T\Debug\my_binary_tree_T.exe : fatal error LNK1120: 1 unresolved externals

W przykładowym programie:

// plik ogolny.cpp
#include "BinTreeT.h"

int main(void)
{
	BinTreeT<int> * a = new BinTreeT<int>();
	
	return 0;
}
0

To już błąd linkera, cały kod szablonu masz w pliku nagłówkowym? Większość kompilatorów /w tym używany w Visualu/ nie wspiera oddzielnej kompilacji - słowa kluczowego export. Implementację przeprowadza się w pliku nagłówkowym lub dosyć brzydkim hakiem w pliku .cpp, include'ując go w .h.

0

Wielkie dzięki!
O to chodziło. Visual rozpoznaje słowo kluczowe export, ale jeszcze ono nie działa.
Możesz powiedzieć kiedy używa się tego "chwytu" z drugim typename?

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