|
|
||||||
|
#1
|
|
|
|
|
Mam taki problem. W jednym pliku mam funkcję szablonową:
template <class T> void AddToLog(T msg) { ofstream log("log.txt", ios::app); log << msg << endl; log.close(); } Chciałbym móc ją wywoływac z poziomu innego pliku źródłowego. Dlatego stworzyłem sobie plik "io.h", w którym umieściłem deklarację: template <class T> void AddToLog(T msg); Teraz z poziomu tego innego pliku wywołuję: #include "io.h" AddToLog("Test"); Niestety w czasie kompilacji otrzymuję: undefined reference to `void AddToLog<char const*>(char const*)' Czyli wygląda na to że kompilator nie widzi deklaracji funkcji AddToLog :\ (bo gdy usunę deklarację z "io.h" to wywala ten sam błąd). Czy o czymś nie wiem? Zapomniałem o czymś? Jeżeli tak to o czym? O jakiejś dziwnej deklaracji f. szablonowej? Aha. Korzystam z mingw (Dev-C++ 4.9.8.5) Z góry dziękuję za pomoc :) |
|
|
|
#2
|
|
|
|
|
On Sun, 25 Jan 2004 21:33:48 +0000, Mateusz Majchrzycki wrote:
> Mam taki problem. W jednym pliku mam funkcję szablonową: Szablony powinny być zdefiniowane w plikach nagłówkowych, inaczej niż zwykłe funkcje. |
|
#3
|
|
|
|
|
Mateusz Majchrzycki wrote:
> template <class T> > void AddToLog(T msg) > { > ofstream log("log.txt", ios::app); > log << msg << endl; > log.close(); > } Dołączaj całe ciało szablonu (tak jak powyżej). Pamiętaj że szablon to jest przepis jak wygenerować kod - a nie sam kod. Dlatego w momencie odwoływania się do funkcji szablonowej musi być znane jej całe ciało. Z samej deklaracji nic nie wygeneruje. |
|
#4
|
|
|
|
|
Pewnego dnia Marcin 'Qrczak' Kowalczyk <qrczak> nastukał(a):
>> Mam taki problem. W jednym pliku mam funkcję szablonową: > Szablony powinny być zdefiniowane w plikach nagłówkowych, > inaczej niż zwykłe funkcje. No to klops :( Chyba będę musiał się przerzucić na stdio :( (To tak w związku z moim problemem z Allegro i iostream) |
|
#5
|
|
|
|
|
On Mon, 26 Jan 2004 19:28:49 +0000 (UTC), Mateusz Majchrzycki
<spam> wrote: >Chyba będę musiał się przerzucić na stdio :( Po co? Przenies body funkcji do pliku .h i z glowy. milego dnia zycze hej |
|
#6
|
|
|
|
|
On Mon, 26 Jan 2004 19:28:49 +0000, Mateusz Majchrzycki wrote:
>> Szablony powinny być zdefiniowane w plikach nagłówkowych, >> inaczej niż zwykłe funkcje. > > No to klops :( > Chyba będę musiał się przerzucić na stdio :( > (To tak w związku z moim problemem z Allegro i iostream) Jaki jest problem z Allegro i iostream? (W tamtym poście napisałeś, że są błędy. Nie jestem wróżką. Jakie błędy?) |
|
#7
|
|
|
|
|
On Mon, 26 Jan 2004 19:28:49 +0000 (UTC), Mateusz Majchrzycki wrote:
> Pewnego dnia Marcin 'Qrczak' Kowalczyk <qrczak> nastukał(a): >>> Mam taki problem. W jednym pliku mam funkcję szablonową: >> Szablony powinny być zdefiniowane w plikach nagłówkowych, >> inaczej niż zwykłe funkcje. > > No to klops :( E, no nie przsadzaj. Nie trzeba się poddawać :). Da się definiować szablony w pliku .cpp , ale potem musisz jawnie tworzyć ich konkretyzacje. Przykład: // utility_str.hpp // deklaracja funkcji szablonowej template <typename T> void trim(std::basic_string<T>& str, const std::basic_string<T>& ws = chars<T>::ws); // utility_str.cpp // definicja funkcji szablonowej template <typename T> void trim(std::basic_string<T>& str, const std::basic_string<T>& ws /* = chars<T>::ws */) { size_t first = 0; size_t pfirst = first; do { pfirst = str.find_first_not_of(chars<T>::null, first); first = str.find_first_not_of(ws.c_str(), pfirst); } while (first != pfirst); // ... itd } // jawna konkretyzacja template void trim<char>(std::basic_string<char>& str, const std::basic_string<char>& ws); template void trim<wchar_t>(std::basic_string<wchar_t>& str, const std::basic_string<wchar_t>& ws); Trochę to upierdliwe, dlatego jest rzadko stosowane. Znacznie prościej powiedzieć, że klasę szablonową (czy funkcję) należy w całości zdefiniować w pliku nagłówkowym. To samo można robić dla klas (całych albo wybranych funkcji składowych). Po szczegóły odsyłam do najlepszej książki o szablonach, jak została do tej pory wydana (na świecie - polskiego wydania nawet nie znam): http://helion.pl/ksiazki/cpszav.htm B. |
|
#8
|
|
|
|
|
Pewnego dnia Maciej Pilichowski <macias> nastukał(a):
>>Chyba będę musiał się przerzucić na stdio :( > Po co? Przenies body funkcji do pliku .h i z glowy. Żeby to było takie proste to bym wam du**, za przeproszeniem, nie truł :) Problem rozbija się o niemożność współistnienia iostream z allegro w jednym pliku źrółowym. Dlatego chciałem "galwanicznie" ;) rozdzielić wszystko co używa <iostream> od rzeczy które będą używały allegro. |
|
#9
|
|
|
|
|
Pewnego dnia Marcin 'Qrczak' Kowalczyk <qrczak> nastukał(a):
> Jaki jest problem z Allegro i iostream? Już kiedyś o tym pisałem, ale bez odezwu. Chodzi o to że jeżeli w jednym pliku źródłowym dołączy się: #include <allegro.h> #include <iostream> to pojawiają się błąd: In file included from E:/PROGS/DEV-CPP5/include/windows.h:52, from E:/PROGS/DEV-CPP5/include/c++/mingw32/bits/gthr- default.h:462, from E:/PROGS/DEV- CPP5/include/c++/mingw32/bits/gthr.h:98, from E:/PROGS/DEV- CPP5/include/c++/mingw32/bits/c++io.h:37, from E:/PROGS/DEV-CPP5/include/c++/bits/fpos.h:44, from E:/PROGS/DEV-CPP5/include/c++/iosfwd:46, from E:/PROGS/DEV-CPP5/include/c++/ios:44, from E:/PROGS/DEV-CPP5/include/c++/ostream:45, from E:/PROGS/DEV-CPP5/include/c++/iostream:45, from main.cpp:2: E:/PROGS/DEV-CPP5/include/wingdi.h:1181: conflicting types for `typedef struct tagBITMAP BITMAP' E:/PROGS/DEV-CPP5/include/allegro/gfx.h:234: previous declaration as `typedef struct BITMAP BITMAP' Czyli jak widać poprzez sieeeeć zależności okazuje się że dwa razy pojawia się typedef (...) BITMAP. |
|
#10
|
|
|
|
|
On Mon, 26 Jan 2004 22:25:55 +0000, Mateusz Majchrzycki wrote:
> Czyli jak widać poprzez sieeeeć zależności okazuje się że dwa razy > pojawia się typedef (...) BITMAP. Może można to obejść przez #define BITMAP BITMAP_ALLEGRO #include <nagłówek allegro> #undef BITMAP albo w drugą stronę. Byle nazwa typu nie występowała w parametrach funkcji C++, ale to pewnie jest C. |
|
|
| Podobne wątki | |
| wywołanie funkcji Czesc Po załadowaniu strony zawierającej formularz chciałbym wywołać pewną funkcję javascriptu - refreshPage(). Jak to zrobić? To znaczy, w którym momencie wywołać funkcję?... |
|
| wywołanie funkcji Witam... Mam funkce "tmslownie" do zamieniania cyfr na kwotę słownie i nie wiem jak wywołać tą funkcę w formularzu. Poniższy sposób nie działa. tmSlownie = True Proszę o... |
|
| Jak przyjąć jako argument funkcji wywołanie innej funkcji Sprawa jest taka: Stworzyłem klasę eksperymentator, która służy do przeprowadzania eksperymentu obliczeniowego (taki bajer na studiach, wykresy czasu działania algorytmów w... |
|
| Czy jest możliwe wywołanie funkcji innej funkcji podanej za pomocą zmiennej ? Pytanie jak w temacie. Jest sobie funkcja która tworzy dynamicznie inną funkcję, której nazwa jest tworzona w taki sposób, aby w momencie wykonywania tej samej funkcji... |
|
|
Czasy w strefie GMT. Teraz jest 23:04. | Privacy Policy
|