Ĺadny brzuch
Witam.
Mam trzy pliki:
// plik.h template<class T> class Pole { private: T* pole; int dl; public: Pole (int d); };
// plik1.cpp #include "plik.h" export template<class T> Pole<T>::Pole(int d):dl(d) { pole = new T[d]; for (int i=0;i<d;++i) pole[i]=T(0); }
// plik.cpp #include "plik.h" Pole<int> p(20);
i przy kompilacji w BCB wypisuje mi cos takiego:
Unresolved external 'Pole<int>::Pole<int>(int)' referenced from (...)PLIK.OBJ
Nie znajduje chyba definicji konstruktora czy co?
pomóżcie...
Przy szablonach deklaracja i definicja powinna byc w tym samym pliku(i tio ma byc plik *.h). Spowodowane jest to tym, ze szablony generowanbe sa w miare potrzeb w czasei kompilacji, a w przypadku kiedy deklaracja jest osobno kompilowana to nie ma mozliwosci wygenerowania jakiegos konkretnego typu dla szablony.
Chyba zamotalem, ale tak troszeczke :D
Witam.
(...)
i przy kompilacji w BCB wypisuje mi cos takiego:
Unresolved external 'Pole<int>::Pole<int>(int)' referenced from (...)PLIK.OBJ
Nie znajduje chyba definicji konstruktora czy co?
pomóżcie...
Czy ty wiesz jak się definiuje pliki nagłówkowe ???
Czy wiesz jak się definiuje funkcje które są w szablonach ??
Nie bardzo wiem o co ci chdzi z tym definiowaniem...
Czy to jest źle zdefioniwane?
template<class T> Pole<T>::Pole(int d):dl(d) { pole = new T[d]; for (int i=0;i<d;++i) pole[i]=T(0); }
A jesli dobrze czy może sie znajdowac w pliku naglówkowym?
I jeszcze pytanie o ten kawalek:
emplate<class T> Pole<T>::Pole(int dd) { dl=dd; Dlugosc(); } template<class T> void Pole<T>::Dlugosc() { printf("%d",dl); }
nie rozumiem co robic, i w jakim celu, w konstruktorze funkcja Dlugosc()...
I jeszcze jedna sprawa:
// plik1.cpp #include "plik.h" export template<class T> Pole<T>::Pole(int d):dl(d) { pole = new T[d]; for (int i=0;i<d;++i) pole[i]=T(0); }
czy "export" nie załatwia tutaj sprawy umieszczenie deklaracji i definicji w różnych plikach?
Użytkownik Atal edytował ten post 07 sierpień 2005, 13:01
Sam sobie zdefiniowałem, tak by sprawdzić czy działa poprawnie.
Mylisz plik nagłowkowy z szablonem :excl: i dlatego zadajesz kolejne glupie pytanie.
Jak ci Dlugosc() nie pasi to wykasuj. Napisałem to po to (czytaj 1 zdanie) a ponad to byś oszczędził sobie pytania jak się definiuje funkcje w szablonach. Dlaczego nie przeanalizujesz tego co napisałem ? tylko piszesz kolejnego ? B)
Ależ ja przeanalizowałem to co napisałeś.
I nie znalazłem tam odpowiedzi na moje pierwsze pytanie:
dlaczego to nie działa...
przecież w C++ definicja, deklaracja metod wzorca
i wywoplanie wzorca (konstruktora wzorca) mogą
byc w trzech różnych plikach byle deklaracje opatrzeć
słowem "export". (chyba, że się mylę)
i tego własnie dotyczyło moje pytanie...
a nie tworzenie plików nagłowkowych.
Coś nie możemy się zrozumieć.
Pozdrawiam Atal
Coś nie możemy się zrozumieć.
Pozdrawiam Atal
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Mam trzy pliki:
// plik.h template<class T> class Pole { private: T* pole; int dl; public: Pole (int d); };
// plik1.cpp #include "plik.h" export template<class T> Pole<T>::Pole(int d):dl(d) { pole = new T[d]; for (int i=0;i<d;++i) pole[i]=T(0); }
// plik.cpp #include "plik.h" Pole<int> p(20);
i przy kompilacji w BCB wypisuje mi cos takiego:
Unresolved external 'Pole<int>::Pole<int>(int)' referenced from (...)PLIK.OBJ
Nie znajduje chyba definicji konstruktora czy co?
pomóżcie...
Przy szablonach deklaracja i definicja powinna byc w tym samym pliku(i tio ma byc plik *.h). Spowodowane jest to tym, ze szablony generowanbe sa w miare potrzeb w czasei kompilacji, a w przypadku kiedy deklaracja jest osobno kompilowana to nie ma mozliwosci wygenerowania jakiegos konkretnego typu dla szablony.
Chyba zamotalem, ale tak troszeczke :D
Witam.
(...)
i przy kompilacji w BCB wypisuje mi cos takiego:
Unresolved external 'Pole<int>::Pole<int>(int)' referenced from (...)PLIK.OBJ
Nie znajduje chyba definicji konstruktora czy co?
pomóżcie...

Czy ty wiesz jak się definiuje pliki nagłówkowe ???
Czy wiesz jak się definiuje funkcje które są w szablonach ??
Nie bardzo wiem o co ci chdzi z tym definiowaniem...
Czy to jest źle zdefioniwane?
template<class T> Pole<T>::Pole(int d):dl(d) { pole = new T[d]; for (int i=0;i<d;++i) pole[i]=T(0); }
A jesli dobrze czy może sie znajdowac w pliku naglówkowym?
I jeszcze pytanie o ten kawalek:
emplate<class T> Pole<T>::Pole(int dd) { dl=dd; Dlugosc(); } template<class T> void Pole<T>::Dlugosc() { printf("%d",dl); }
nie rozumiem co robic, i w jakim celu, w konstruktorze funkcja Dlugosc()...
I jeszcze jedna sprawa:
// plik1.cpp #include "plik.h" export template<class T> Pole<T>::Pole(int d):dl(d) { pole = new T[d]; for (int i=0;i<d;++i) pole[i]=T(0); }
czy "export" nie załatwia tutaj sprawy umieszczenie deklaracji i definicji w różnych plikach?
Użytkownik Atal edytował ten post 07 sierpień 2005, 13:01
Sam sobie zdefiniowałem, tak by sprawdzić czy działa poprawnie.
Mylisz plik nagłowkowy z szablonem :excl: i dlatego zadajesz kolejne glupie pytanie.
Jak ci Dlugosc() nie pasi to wykasuj. Napisałem to po to (czytaj 1 zdanie) a ponad to byś oszczędził sobie pytania jak się definiuje funkcje w szablonach. Dlaczego nie przeanalizujesz tego co napisałem ? tylko piszesz kolejnego ? B)
Ależ ja przeanalizowałem to co napisałeś.
I nie znalazłem tam odpowiedzi na moje pierwsze pytanie:
dlaczego to nie działa...
przecież w C++ definicja, deklaracja metod wzorca
i wywoplanie wzorca (konstruktora wzorca) mogą
byc w trzech różnych plikach byle deklaracje opatrzeć
słowem "export". (chyba, że się mylę)
i tego własnie dotyczyło moje pytanie...
a nie tworzenie plików nagłowkowych.
Coś nie możemy się zrozumieć.
Pozdrawiam Atal
Coś nie możemy się zrozumieć.
Pozdrawiam Atal
