Anzeige:
Ergebnis 1 bis 6 von 6

Thema: Probleme mit templates unter C++

  1. #1
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278

    Probleme mit templates unter C++

    Hallo,

    ich habe jetzt langsam den gesamten Stroustrup durch. Das Internet gibt dazu leider auch nicht mehr her. Ich denke, ich habe alles richtig gemacht. Folgendes: Ich möchte meine Klassen jetzt teilweise durch templates "erstetzen".
    Zitat Zitat von C++-File
    #include "SimpleVector.h"

    template<class T>

    SimpleVector<T>::SimpleVector(const unsigned int length) {

    _length = length;

    }
    Zitat Zitat von header-file
    #include <iostream>

    #ifndef _SIMPLEVECTOR
    #define _SIMPLEVECTOR

    template <class T>
    class SimpleVector {

    private:
    unsigned int _length;

    public:
    SimpleVector(const unsigned int length);

    };

    #endif
    Soweit so gut, nur leider klappt das nicht. Ich bekomme folgenden Fehler:
    Zitat Zitat von XCode sagt
    ZeroLink: unknown symbol '__ZN12SimpleVectorIdEC1Ej'

    Executable “MeCevis” has exited due to signal 6 (SIGABRT).
    Ich initialisiere es so
    SimpleVector<double> *v = new SimpleVector<double>(_dim);
    Naja, schön ist das nicht. Wenn ich alles ins header-file schreibe, klappt es einwandfrei. Hat da jemand einen Tip?

    Ps: ich sollte erwähnen, dass ich mit einem Mac mit der Entwicklungsumgebung XCode arbeite. Kompiliert wird mit gcc3.3.
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

  2. #2
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Zitat Zitat von Sym
    ich habe jetzt langsam den gesamten Stroustrup durch.
    Gut, wenn du den Stroustrup zur Hand hast, macht es mir einfacher.
    Schlage im Index "export" nach.Bei mir (3. Auflage) ist das gesuchte zu finden unter 13.7 Organisation des Quellcodes.

    Und gleich hinterher, export funktioniert bei deinem Compiler nicht.

    Als "Lösung" schlage im Index nach "Templates - explizite Instanziierung", bei mir unter C.13.10.

  3. #3
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278
    Hmm,

    da war ich schon so weit und kurz davor habe ich aufgehört. Bin nun auch schon länger am Suchen, aber das will ich heute noch hinbekommen. Wenn ich das richtig verstehe, muss ich bei der Expliziten Instanziierung für jeden möglichen Typ eine Methode implementieren? Jedenfalls werde ich darauf nicht richtig schlau.

    Wie bringe ich sagen wir eine Methode void doso(void) im Header-File unter? Egal wie ich es anstelle, der Compiler sagt mir:
    SimpleVector.cpp:12: explicit instantiation of `void SimpleVector<T>::doso() [with T = double]' but no definition available
    .
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

  4. #4
    Registrierter Benutzer
    Registriert seit
    24.06.2003
    Beiträge
    486
    Die Expliziten Instanziierungen bringst du nicht im Header unter, sondern in deiner *.cpp Datei, hier also SimpleVector.cpp.

    Bei einer Klasse machst du am besten gleich die Instanziierung für die ganze Klasse und alle ihre Methoden mit: template class SimpleVector<double>;
    Gleich am Anfang in SimpleVector.cpp.

  5. #5
    Registrierter Benutzer Avatar von Sym
    Registriert seit
    05.09.2002
    Ort
    Bremen
    Beiträge
    278
    Zitat Zitat von wraith
    Die Expliziten Instanziierungen bringst du nicht im Header unter, sondern in deiner *.cpp Datei, hier also SimpleVector.cpp.

    Bei einer Klasse machst du am besten gleich die Instanziierung für die ganze Klasse und alle ihre Methoden mit: template class SimpleVector<double>;
    Gleich am Anfang in SimpleVector.cpp.
    Vielen Dank. Das hat jetzt geklappt. Ich habe aber nicht ganz verstanden, warum man die jetzt vorher für alle Typen instanziieren muss.

    Wenn Du mal Zeit und Lust findest, könntest Du es mir ja mal erklären (oder auch auf entsprechende Quellen verweisen).
    Denk mal drüber nach...

    Lars

    ACHTUNG: ersetze Linux durch GNU/Linux an den entsprechenden Stellen
    www.macuser.de, MSVC2005 Express und Qt, Qt/Mac installieren

  6. #6
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Templates müssen inline (bzw. in der .h file) definiert sein.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •