template <class T> i VS 2005

0

Robie sobie klase w vs i wpadlem na pomysl zeby zrobic ja przy uzyciu stl, bardziej uniwersalna. Tak wiec dodalem sobie template <class T> i sparametryzowalem wszystkie metody w klasie, jednak pojawil mi sie problem, mialem cos takiego:

//plik klasa.h
template <class T>
class Klasa
{
 //metody publiczne
};

//plik klasa.cpp
#include "Klasa.h"
template <class T>
void Klasa<T>::jakas_metoda()
{
 //kod metody
}

I w tym momencie pojawil sie blad linkera, rozwiazalem to tak ze definicje funkcji przenioslem bezposrednio do deklaracji klasy, czyli pliku .h cos w stylu tego jak sie to robi w javie czy c#. Slyszalem tez o rozbiciu klasy na 2 pliki naglowkowe, ale czy cos takiego jak rozbije na 2 pliki naglowkowe bedzie szybsze niz to co ja zrobilem, czy bez roznicy?

0

Kompilacja będzie szybsza.

0

Sam sobie odpowiem jeszcze na temat kolejnej roznicy, otoz jak nie mam pliku .h to nie widze intelli sense ;/ Chyba jednak musze przejsc na tamto.

0

A to dziwne, u mnie działa.

0

Ale co intelli sense czy to z templatami? Wiesz w pliku powiedzmy glowny.cpp tez mi dziala, ale nie wewnatrz klasy tj powiedzmy napisze this-> i nic mi nie wyskakuje ;/

0

Klasa.h

//plik klasa.h
template <typename T>
class Klasa
{
public:
	void jakas_metoda();
};

Klasa.cpp

//plik klasa.cpp
#include "k.h"


template <typename T>
void Klasa<T>::jakas_metoda()
{
 //kod metody
}

Do this bezpośrednio w klasie nie można się odwołać (bo po co?). W metodach tak. Intellisense działa mi w obu przypadkach.

0

Wlasnie racja ;] Ale uzywasz visuala, bo mi wlasnie jak tak zrobie to niestety nie dziala ;/ Tj blad linkera ;/

0

Używam Visual Studio 2005 i nawet sprawdziłem zanim Ci o tym napisałem. Może zły projekt stworzyłeś.

0

Hm pisze pod opengl+glui i stworzylem console application, bo glui wymaga tego, ale zaraz sobie stworze projekt konsolowy i sprawdze. Tj ogolnie to pisze biblioteke matematyczna i wsyzstko bylo ok, dopoki nie wymyslilem, ze lepiej jak klasa by byla generyczna.

0

zeby byla szablonem. generyki sa w Javie i to zupelnei cos innego. Jesli Intellisense Ci wysiadlo, to byc moze pojawil sie jakis blad w jego bazie danych - zakmnij visuala, usun plik .ncb (ten duuzy w stosunku do innych) siedzacy w katalogu projektu i po wlaczeniu visuala powinien sie odbudowac i juz byc prawidlowy. Inna sprawa, ze intellisense nie do konca dobrze sobie radzi w przypadku pewnych (prawidlowych) konstrukcji C++ - czesto widywalem sytuacje gdzie dopisanie 1 linijki go wywalalo i przestawal dalej plik skanowac.. ale Twoj przypadek jest dosc prosty i jesli kod masz poprawny to raczej stawiam na blad w .ncb

a blad linkera sie pojawia, w momencie gdy w pliku .h dasz definicje template'a (klasy, funckji..) a w pliku .cpp jego cialo. Bierze sie to stad, ze w momencie kompilowania pliku .cpp i tworzenia kodu maszynowego kompilator nie wie jakimi parametrami uszczegolowic szablon (tzn. co podstawiac za T). Generuje 'cos', ale to 'cos' nie pasuje potem do tego czego inne klasy chca uzywac. Taki podzial na .h i .cpp mozna stosowac tylko w dwoch przypadkach:

  • klasa/funkcja nie jest template
  • to jest template, ale w pliku .cpp wyraznie napiszesz jakie specjalizacje maja zaistniec np.
plik.h:
//def. klasy
template<class T>
class mojaklasa
{...};

plik.cpp:
//def. cial metod
template<class T>
cos mojaklasa<T>::funkcja(..)
{...}

//explicit specialisation
class mojaklasa<int>;
class mojaklasa<float>;

w/w przyklad utworzy kod dla specjalizacji int i float, i jesli zadne inne specjalizacje nie beda uzywane, to sie skompiluje. ale jak gdzies sprobujesz uzyc mojakalsa<double> a ona nie bedzie wymieniona - znowu sie linker errory pojawiaja. Dlatego tez najczesciej klasy template po prostu pisze sie w calosci w pliku .h, bez podzialu, wtedu problemu nie ma

-- drobna uwaga - w specyfikacji C++ jest napisane, ze kompilatory powinny sobie radzic z przypadkiem podzialu template'a na .h i .cpp bez podobnych cyrkow. niestety, obecnie tylko komercyjny kompilator Comeau sobie radzi. Szczerze powiem ze nie wiem na ile, nie probowalem

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