Probleme mit Templates?
-
Hallo Leute, habe folgende Klasse definiert:
#ifndef LIST_HPP #define LIST_HPP #include "list_item.hpp" template<class typ> class list { public: explicit list() {} void hello(); }; #endif...und hier implementiert (eine Memberfunktion):
#include "list.hpp" #include <iostream> using namespace std; template<class typ> void list<typ>::hello() { cout << "hello" << endl; }in main dann ein Klassenobjekt definiert:
int main) { list<int> liste; liste.hello(); system("PAUSE"); return EXIT_SUCCESS; }und prompt motzt der Linker:
[Linker error] undefined reference to `list<int>::hello()'Das passiert auch nur, wenn ich die Klasse als Template definiere, warum, was muss ich tun um das Problem zu lösen?
benutze devC++ mit Mingw Compiler
-
Template-Funktionen und Methoden mußt du (inline) im Header definieren, sonst macht der Compiler/Linker nicht mit (in der list.cpp weiß er nicht, für welchen Typ er die Funktion erstellen soll, in der main.cpp kennt er ihre Definition nicht - ergo kann er keinen Maschinencode erzeugen).
-
Danke für die schnelle Antwort!
-
Naja, inline muss es nicht sein. Wenn du Wert darauf legst, das Implementierung und Schnittstelle "getrennt" sind, kannst du auch die entsprechende .cpp am Ende des Headers inkludieren (dann ist es allerdings ratsam, deren Endung zB in .ipp zu ändern).
Übrigens ist das Problem auch in den "Meistgestellten Fragen", Frage 5 erläutert.
-
Danke, hätte nie gedacht, dass das nur auf diese Weise funktioniert, aber man wird immer wieder eines Besseren belehrt!

-
Sorry, muss euch nochmal stören
hab deinen Tipp befolgt .filmor:
.filmor schrieb:
Naja, inline muss es nicht sein. Wenn du Wert darauf legst, das Implementierung und Schnittstelle "getrennt" sind, kannst du auch die entsprechende .cpp am Ende des Headers inkludieren (dann ist es allerdings ratsam, deren Endung zB in .ipp zu ändern).
#ifndef LIST_HPP #define LIST_HPP #include "list_item.hpp" template<class typ> class list { public: explicit list() {} void hello(); }; #include "list.ipp" #endifFunktioniert aber nicht und ich hab auch keine Ahnung was für eine Art von Fehler das ist (Compiler/Linker?):
C:\Sicherungsdateien\Stufe1\Programmieren\C++\Klassen\Liste(3)\Makefile.win [Build Error] [Liste.exe] Error 1
-
Man könnte auch das Schlüsselwort export verwenden. Dass wäre zwar statndard konform. Allerdings kenne ich nur einen Compiler der das implementiert.(Comeau)
-
Jupp, danke, dieser Tipp steht auch schon bei den meistgestellten Fragen, hab eben mal nachgeschaut, aber hier hab ich inzwischen ein anderes Problem, woher kommt dieser Build Error?
-
Also bei mir klappts. Kontrollier nochmal deine Build-Einstellungen, die ipp-Datei soll /nicht/ kompiliert werden.
Außerdem musst du jetzt darauf achten, dass list.ipp ein Header ist, using namespace ist also nicht!
-
Danke!! Es klappt, auch wenn ich nicht weiß, was du damit meinst
.filmor schrieb:
Außerdem musst du jetzt darauf achten, dass list.ipp ein Header ist, using namespace ist also nicht!
kann using namespace std; verwenden
-
ach ich habs schon gefunden, das Stichwort ist namespace-pollution