Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Konstruktor mit Template-Listen auslagern

Empfohlene Antworten

Veröffentlicht

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?

  • Autor

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.

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.