Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Cyianor Super JLI'ler

Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 09.11.2004, 18:16 Titel: Problem mit Templates |
|
|
Hi,
ich hab auf Patricks Hinweis hin mich mal näher mit Templates beschäftigt. Allerdings schein ich das ganze noch nicht so ganz verstanden zu haben. Ich hoffe jemand kann mir helfen.
Also, ich hab eine Logklasse:
Code: | #ifndef _LOG_H_
#define _LOG_H_
#include <string>
#include <fstream>
class Log
{
public:
Log(std::string path) :
mPath(path),
mStream(path.c_str())
{
mStream.close();
}
template <class T>
Log & operator << (const T& obj)
{
mStream.open(mPath.c_str(), std::ios::out | std::ios::app);
mStream << obj;
mStream.close();
return *this;
}
private:
std::string mPath;
std::ofstream mStream;
};
#define ENDL '\n'
extern Log LOG;
#endif |
den Tutorials zufolge müsste das funktionieren. Tut es aber nicht.
Ich erhalte folgende Compilerfehler:
Code: | Compiler: Default compiler
Building Makefile: "C:\Programme\Dev-Cpp\Projects\sipher\Makefile.win"
Führt make... aus
make.exe -f "C:\Programme\Dev-Cpp\Projects\sipher\Makefile.win" all
g++.exe main.o Sipher_private.res -o "Sipher.exe" -L"C:/Programme/Dev-Cpp/lib" -mwindows -lmingw32 -lSDLmain -lSDL
main.o(.text+0x17f):main.cpp: undefined reference to `Log::Log(std::string)'
main.o(.text+0x395):main.cpp: undefined reference to `Log& Log::operator<< <char[37]>(char[37] const&)'
main.o(.text+0x3a1):main.cpp: undefined reference to `Log& Log::operator<< <char*>(char* const&)'
main.o(.text+0x3b1):main.cpp: undefined reference to `Log& Log::operator<< <char>(char const&)'
main.o(.text+0x3d9):main.cpp: undefined reference to `Log& Log::operator<< <char[26]>(char[26] const&)'
main.o(.text+0x3e8):main.cpp: undefined reference to `Log& Log::operator<< <char*>(char* const&)'
main.o(.text+0x3fb):main.cpp: undefined reference to `Log& Log::operator<< <char>(char const&)'
make.exe: *** [Sipher.exe] Error 1
Ausführung beendet
|
Vision |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 09.11.2004, 18:31 Titel: |
|
|
Hi,
der Code ist eigentlich richtig, ich hab ihn mal überarbeitet:
Code: |
#include <string>
#include <fstream>
class Log
{
public:
Log(const std::string &path) : path_(path), stream_(path.c_str())
{
stream_.close();
}
template <class T> Log & operator << (const T& object)
{
stream_.open (path_.c_str(), std::ios::out | std::ios::app);
stream_ << object;
stream_.close ();
return (*this);
}
private:
std::string path_;
std::ofstream stream_;
};
int main (void)
{
Log x ("test.txt");
int integer = 33;
x << "hallo" << "test" << integer;
return 0;
} |
Wenn Du das compilieren kannst gehts, ansonsten würd ich mal fragen was ist mit diesem extern?
- Patrick _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
Cyianor Super JLI'ler

Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 09.11.2004, 18:44 Titel: |
|
|
hm, deine Version scheint zu funktionieren...
aber das extern...da dürfte eigentlich kein Fehler mit sein.
main.cpp
Code: | #include <cstdio>
#include <cstdlib>
#include <SDL/SDL.h>
#include "log.h"
SDL_Surface *screen = NULL;
Log LOG("log.txt");
int main(int argc, char* argv[])
{
int running = 1;
if(SDL_Init(SDL_INIT_VIDEO) < 0) {
LOG << "Couldn't initialize SDL: " << SDL_GetError() << ENDL;
exit(1);
}
atexit(SDL_Quit);
screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE | SDL_DOUBLEBUF);
if(screen == NULL) {
LOG << "Couldn't set 640x480x16 video mode: " << SDL_GetError() << ENDL;
exit(2);
}
SDL_WM_SetCaption ("Sipher", NULL);
while(running)
{
SDL_Event event;
while(SDL_PollEvent(&event))
{
switch(event.type)
{
case SDL_KEYDOWN:
break;
case SDL_QUIT:
running = 0;
break;
default:
break;
}
}
}
return 0;
} |
|
|
Nach oben |
|
 |
Cyianor Super JLI'ler

Anmeldedatum: 23.12.2002 Beiträge: 452
Medaillen: Keine
|
Verfasst am: 10.11.2004, 15:48 Titel: |
|
|
hm so wie es scheint liegt das Problem darin das das Template in einer anderen Datei deklariert wird als in der, in der es letztendlich verwendet wird. Ist das normal?? |
|
Nach oben |
|
 |
C++Builder Senior JLI'ler

Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 15.01.2005, 15:50 Titel: |
|
|
Dieses Phänomen hab ich auch mit einer Template-Funktion, ist das wirklich normal oder wie umgeht man das? |
|
Nach oben |
|
 |
Jonathan_Klein Living Legend

Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 15.01.2005, 19:08 Titel: |
|
|
tjo ich habe gehört das man Templatefuntionen genau wie inline Funktionen nihc in kehere Dateien aufteilen kann. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
 |
Patrick Dark JLI Master

Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 15.01.2005, 22:32 Titel: |
|
|
Jonathan_Klein
Auf meinen Wunsch haste doch meinen Text hier reingestopft:
http://www.jliforum.de/board/viewtopic.php?t=3075
Topic
Templates und inline/__inline/__forceinline/__fastcall/__stdcall und co, kann man nicht splitten (Ausnahmen stehen im FAQ)
Es gibt jedoch die möglichkeit über inline(*.inl) bzw. template(*.tpl) Dateien, doch da sollte man schon etwas mehr Ahnung von haben, da man sich mit falschen Verknüpfungen bzw. #pragmas ne ganze Menge im Quellcode mit zerschießen kann, da diese besagten Dateien anders aufgebaut sind als normale *.cpp und *.h Dateien.
Kurz: Wenn man grad erst mit Templates und inline anfängt: Finger weg.
- Patrick _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
 |
|