hilpers


  hilpers > comp.lang.* > comp.lang.c

 #1  
25.01.2004, 20:33
Mateusz Majchrzycki
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  
25.01.2004, 21:45
Marcin 'Qrczak' Kowalczyk
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  
26.01.2004, 12:44
Tomek
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  
26.01.2004, 18:28
Mateusz Majchrzycki
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  
26.01.2004, 18:43
Maciej Pilichowski
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  
26.01.2004, 18:58
Marcin 'Qrczak' Kowalczyk
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  
26.01.2004, 18:59
Bronek Kozicki
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  
26.01.2004, 21:24
Mateusz Majchrzycki
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  
26.01.2004, 21:25
Mateusz Majchrzycki
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  
26.01.2004, 22:02
Marcin 'Qrczak' Kowalczyk
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