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.

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...