Zum Inhalt springen

Konstruktor mit Template-Listen auslagern


Empfohlene Beiträge

Geschrieben

Abend, ich arbeite an einem Programm um Literatur zu verwalten. In einer Klasse "Verwaltung" möchte ich die Listen verwalten. Es geht dabei im die Code-Schnipsel:

Verwaltung.hpp:


#ifndef __VERWALTUNG_H_
#define __VERWALTUNG_H_

#include "List.hpp"
#include "Person.hpp"
#include "Date.hpp"
#include "Book.hpp"
#include "Journal.hpp"
#include "Lend.hpp"

class Verwaltung{
private:
List<Person> Liste_Person;
List<Book> Liste_Book;
List<Journal> Liste_Journal;
List<Lend> Liste_Lend;

public:

Verwaltung(); // zunächst eine leere Liste erstellen
...
...
...
[/PHP]

[PHP]
#include "Verwaltung.hpp"

Verwaltung::Verwaltung(){}
...
...
...

Beim Kompilieren bekomme ich die Fehler:


/tmp/ccO3rDL8.o: In function `Verwaltung::Verwaltung()':

Verwaltung.cpp:(.text+0x15): undefined reference to `List<Person>::List()'

Verwaltung.cpp:(.text+0x25): undefined reference to `List<Book>::List()'

Verwaltung.cpp:(.text+0x35): undefined reference to `List<Journal>::List()'

Verwaltung.cpp:(.text+0x45): undefined reference to `List<Lend>::List()'

Verwaltung.cpp:(.text+0x5a): undefined reference to `List<Journal>::~List()'

Verwaltung.cpp:(.text+0x6f): undefined reference to `List<Book>::~List()'

Verwaltung.cpp:(.text+0x80): undefined reference to `List<Person>::~List()'

collect2: Fehler: ld gab 1 als Ende-Status zurück

Wenn ich beim Kompilieren die Verwaltung.cpp rausnehme und den Teil in die hpp einfüge:


Verwaltung(){}
[/PHP]

Dann lässt es sich problemlos übersetzen. Ich muss beim Auslagern irgendwas falsch machen. Ich hab jetzt keinen anderen Quellcode gepostet, weil ich nicht sicher bin wo der Fehler liegt. Ich vermute aber, dass er an einer der obrigen Stellen ist.

Kann mir jemand die Fehlermeldung etwas näher bringen?

Geschrieben

Ich sollte vielleicht noch erwähnen, dass ich die List.hpp udn die List.cpp getrennt habe. Ich hab die List.cpp erstmal beim kompilieren ausgeschlossen und die Funktionen in die List.hpp gepackt. So würde es funktionieren. Aber mich würde trotzdem interessieren wie ich den Fehler ohne diesen Schritt wegbekomme.

Geschrieben
Aber mich würde trotzdem interessieren wie ich den Fehler ohne diesen Schritt wegbekomme.
Gar nicht.

Dort, wo die Templates instanziiert werden (in deinem Fall Verwaltung.hpp), muss die vollständige Definition sichtbar sein. Das ist der Grund dafür, dass man Klassentemplates normalerweise nicht in Header- und Implementierungsdatei aufteilt.

Die einzige andere Möglichkeit ist, die konkreten Klassen List<Person> usw. in List.cpp explizit zu instanziieren:

template class List<Person>;

Das erfordert natürlich, dass die Template-Parameter in List.cpp sichtbar sind, was man normalerweise nicht möchte.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...