Auslagern von template-Funktionen in einen header und eine C++-Datei.
-
Huhu,
hier der veränderte Quelltext.
Header:
// Datei quicksort.h #ifndef quicksort_h #define quicksort_h quicksort_h #include<vector> template<class T> void tausche(T&, T&); template<class T> int kleiner(const T&, const T&); template<class T> void drucke(const std::vector<T>&); template<class T> void quicksort(std::vector<T>&, int, int); #include "quicksort.cpp" #endif // Ende der Datei quicksort.h
quicksort.cpp:
template<class T> void tausche(T &a, T &b) { .... } template<class T> int kleiner(const T& a, const T& b) { .... } template<class T> void drucke(const std::vector<T>& V) { .... } template<class T> void quicksort(std::vector<T>& a, int links, int rechts) { .... }
-
Füge mal am Anfang der quicksort.cpp die Zeile "#include "quicksort.h" " ein. Ich finde es zwar etwas merkwürdig, habe es aber gerade in einem Buch gelesen.
Und der Includeguard von quicksort.h wäre bei mir "#define quicksort_h" (ohne das zweite quicksort_h).
-
Wolfi85 schrieb:
Jetzt möchte ich das Programm so umformen, das ich die Funktionsprototypen in eine Header-Datei auslager und die Funktionsdefinitionen in eine *.cpp Datei (welche auch im Header eingebunden wird.).
klappt nicht. der compiler muß die ganze template-definition gelesen haben, um sie zu benutzen. template-code gehört also lustigerweise in den header.
-
volkard schrieb:
Der compiler muß die ganze template-definition gelesen haben, um sie zu benutzen. template-code gehört also lustigerweise in den header.
Ja. Die Definition müsste aber doch durch #include "quicksort.cpp" in quicksort.h eingefügt werden.
-
@Gameco:
Wenn ich am Anfang von Quicksort.cpp "#include "quicksort.h" einfüge bekomme ich die Fehlermeldungen, das die Funktionsvorlagen bereits definiert seien.@Volkard
Aber ich binde doch im Header an der Stelle "#include "quicksort.cpp"" die Definitionen der templates mit ein. Mit include werden doch die Definitionen aus der quicksort.cpp "kopiert" und an dem Punkt: "#include "quicksort.cpp"" "eingefügt" oder verstehe ich was nicht?Gruß Wolfi
-
Ich bin mir gerade nicht sicher, ob der Compiler eine .cpp Datei speziell behandelt, aber benenne doch einfach mal deine .cpp in ein .impl um.
-
Firefighter schrieb:
Ich bin mir gerade nicht sicher, ob der Compiler eine .cpp Datei speziell behandelt, aber benenne doch einfach mal deine .cpp in ein .impl um.
Hi, wenn ich die "quicksort.cpp" in "quicksort.impl" umbennene funktioniert das Programm. Aber warum? Was passiert, wenn ich die Datei umbennene? Ist .impl ein besonderer Dateityp?
Hm, aber irgendwie muss das doch auch mit der Endung .cpp funktionieren...
Gruß Wolfi
-
die *.cpp wird von der IDE durch den compiler gejagt. das ist der unterschied.
und wenn die quicksort.cpp nicht die quicksort.h inkludiert hat, fehlt ihr evtl ein wenig. auch die *.impl sollte die *.h inkludieren. an "impl" ist gar nichts besonderes. die kann heißen, wie sie mag, insbesondere "h".
-
Also wird die .impl Datei nicht kompiliert? Wie Funktioniert das denn dann mit der Übersetzung?
-
Wolfi85 schrieb:
Also wird die .impl Datei nicht kompiliert? Wie Funktioniert das denn dann mit der Übersetzung?
Doch wird sie schon, aber nur indirekt. Grundsätzlich werden nur die .cpp's kompiliert, die allerdings includen header, welche somit auch kompiliert werden. Du kannst .h Dateien in deinem Projekt haben, wie du lustig bist und drinn völligen mist stehen haben, solange das kein .cpp inkludiert wirst du niemals einen Fehler sehen. Anders sieht es bei cpp's aus. (hängt nat. auch noch von Einstellungen der IDE ab..).
-
@ drakon: Danke für die Erklärung :).
Aber um nochmal auf die Aktion mit der C++-Datei zurück zukommen:
Ich habe eben nochmal das Programm so umgestellt:// Datei quicksort.h #ifndef quicksort_h #define quicksort_h #include<vector> template<class T> void tausche(T&, T&); template<class T> int kleiner(const T&, const T&); template<class T> void drucke(const std::vector<T>&); template<class T> void quicksort(std::vector<T>&, int, int); #include "quicksort.cpp" #endif // Ende der Datei quicksort.h
//Datei quicksort.cpp #include"quicksort.h" template<class T> void tausche(T &a, T &b) { .... } template<class T> int kleiner(const T& a, const T& b) { .... } template<class T> void drucke(const std::vector<T>& V) { .... } template<class T> void quicksort(std::vector<T>& a, int links, int rechts) { .... }
Dann bekam ich die Fehlermeldungen:
1>quicksort.cpp
1>c:\....\visual studio 2008\projects\semester 2\uebung 5\quicksort.cpp(9) : error C2995: "void tausche(T &,T &)": Funktionsvorlage wurde bereits definiert.
1> c:\....\visual studio 2008\projects\semester 2\uebung 5\quicksort.h(6): Siehe Deklaration von 'tausche'
1>c:\....\visual studio 2008\projects\semester 2\uebung 5\quicksort.cpp(15) : error C2995: "int kleiner(const T &,const T &)": Funktionsvorlage wurde bereits definiert.
1> c:\....\visual studio 2008\projects\semester 2\uebung 5\quicksort.h(8): Siehe Deklaration von 'kleiner'
1>c:\....\visual studio 2008\projects\semester 2\uebung 5\quicksort.cpp(25) : error C2995: "void drucke(const std::vector<T> &)": Funktionsvorlage wurde bereits definiert.
1> c:\....\visual studio 2008\projects\semester 2\uebung 5\quicksort.h(10): Siehe Deklaration von 'drucke'
1>c:\....\visual studio 2008\projects\semester 2\uebung 5\quicksort.cpp(41) : error C2995: "void quicksort(std::vector<T> &,int,int)": Funktionsvorlage wurde bereits definiert.
1> c:\....\visual studio 2008\projects\semester 2\uebung 5\quicksort.h(12): Siehe Deklaration von 'quicksort'Wenn ich das Richtig verstehe, kommen die Fehler, weil in der Situation die Funktionsdefinition doppelt stattfinden würden (1x in der Header-Datei durch #include"quicksort.cpp" und das zweite mal dadurch, dass die "quicksort.cpp" ja den "quicksort.h" enthält, welcher aber auch die "quicksort.cpp" enthält). Jetzt habe ich eben in der Header die Zeile "#include "quicksort.cpp"" rausgenommen und compilieren lassen. Das Resultat waren 5 Linkerfehler.
Danach habe ich die Zeile wieder an der gleichen Stelle eingefügt und er hat es ohne Fehler übersetzt und ausgeführt.
Sehr seltsam irgendwie...Vielen, vielen Dank an alle und ein schönes Osterfest!!
Gruß Wolfi85
-
//Datei quicksort.cpp
#include"quicksort.h"Nenn sie nicht .cpp, sondern z.B .impl. (cpp wird von den gängigen IDE's als Quelldatei automatisch kompiliert und eingetragen). und lass das include weg, da du diese Datei ja von quicksort.h includes lässt dann sollte das funktionieren.