PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit templates unter C++



Sym
25-01-2005, 20:21
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".

#include "SimpleVector.h"

template<class T>

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

_length = length;

}

#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:

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.

wraith
25-01-2005, 20:29
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.

Sym
25-01-2005, 21:16
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.

wraith
25-01-2005, 21:28
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.

Sym
25-01-2005, 22:14
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).

panzi
26-01-2005, 01:25
Templates müssen inline (bzw. in der .h file) definiert sein.