JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=541503a2e2f168405eb912873110b7aeMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Problem mit Templates

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 09.11.2004, 18:16    Titel: Problem mit Templates Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 09.11.2004, 18:31    Titel: Antworten mit Zitat

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? Wink

- 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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 09.11.2004, 18:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Cyianor
Super JLI'ler



Anmeldedatum: 23.12.2002
Beiträge: 452

Medaillen: Keine

BeitragVerfasst am: 10.11.2004, 15:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 15.01.2005, 15:50    Titel: Antworten mit Zitat

Dieses Phänomen hab ich auch mit einer Template-Funktion, ist das wirklich normal oder wie umgeht man das?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jonathan_Klein
Living Legend


Alter: 37
Anmeldedatum: 17.02.2003
Beiträge: 3433
Wohnort: Siegerland
Medaillen: Keine

BeitragVerfasst am: 15.01.2005, 19:08    Titel: Antworten mit Zitat

tjo ich habe gehört das man Templatefuntionen genau wie inline Funktionen nihc in kehere Dateien aufteilen kann.
_________________
https://jonathank.de/games/
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 15.01.2005, 22:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum