Templatefrage
-
Ich habe in der Headerdatei der Klasse base u. a. (gekürzt) folgenden Eintrag:
template <class T> class base { private: std::vector<std::vector<T> >m_arr; public: base(std::vector<std::vector<T> >const &); };
In der korrespondierenden cpp-Datei steht das:
template <class T> base<T>::base(vector<vector<T> >const &temp) : m_arr(temp.size()) {...}
Das lässt sich noch compilieren.
Rufe ich in main() aber den Konstruktor so auf:
base<int> sim(int_vec);
gibts ne Fehlermeldung über einen unaufgelösten externen Verweis bei public:
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: bla bla bla Debug/dummy.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Was muss ich ändern? Danke.
-
Hallo,
entweder du machst die Klassendefinitionen mit in den Header, oder du includierst
am Ende der Headerfile die korrespondierende UE.mfg
v R
-
template <class T> base<T>::base(vector<vector<T> >const &temp) : m_arr(temp.size()) {...}
in header packen
-
Knuddelbär, dann hab ich aber ca. 30 Fehler
-
Dann mach sie doch weg. Ich nehme an du verwendest VC++. Dort kanns sein, dass man von 2 Fehlern auf weit über hundert kommt und mit zwei Sourcecodeänderungen wieder alles geht. Außerdem werden fatale Fehler nur einzeln angezeigt, ohne die normalen.
-
virtuell Realisticer schrieb:
entweder du machst die Klassendefinitionen mit in den Header, oder du includierst
am Ende der Headerfile die korrespondierende UE.<ot>
Du benutzt den Begriff UE falsch. Eine UE ist nicht mit einer cpp-Datei gleichzusetzen. Vielmehr ist eine UE das Ergebnis des "preprocessings" einer cpp-Datei. Was du am Ende der Headerdatei inkludierst ist also nicht die UE sondern die Implementation des Templates, in diesem Fall die cpp-Datei.
</ot>
-
Ingo schrieb:
Knuddelbär, dann hab ich aber ca. 30 Fehler
Hast du an die std::-Qualifizierung von vector gedacht?
Folgendes sollte sich problemlos übersetzen lassen:
#include <vector> template <class T> class base { private: std::vector<std::vector<T> >m_arr; public: base(std::vector<std::vector<T> >const &); }; template <class T> base<T>::base(std::vector< std::vector<T> >const &temp) : m_arr(temp.size()) {}
-
Ich habe es genauso gemacht, wie ihr vorgeschlagen habt. Das von Hume habe ich Punkt für Punkt noch mal mit meinem Geschreibsel verglichen. Alles genauso wie er gemacht.
Was ich nicht verstehe: Wenn ich die Klasse nicht aufteile in eine Header- und cpp-Datei, sondern die Klasse komplett nur in der main-Datei erstelle, kann ich das Projekt compilieren.
Teile ich die Klasse aber auf in die Header- und cpp-Datei, bekomme ich diese Fehlermeldung. Am Code selbst habe ich rein gar nichts geändert*Linker-Vorgang läuft...
main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: __thiscall base<float>::base<float>(class std::vector<class std::vector<float,class std::allocator<float> >,class std::allocator<class std::vector<float,class std::allocator<float>> const &)" (??0?vector@V?allocator@M@std@@@std@@V?vector@MV?$allocator@M@std@@@std@@@2@@std@@@Z)
Debug/dummy.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.*
-
@Ingo
Du musst die Antworten schon lesen. Ansonsten kann dir nicht geholfen werden.Schau auch noch mal hier:
http://www.c-plusplus.net/forum/viewtopic.php?t=39467
-
HumeSikkins schrieb:
virtuell Realisticer schrieb:
entweder du machst die Klassendefinitionen mit in den Header, oder du includierst
am Ende der Headerfile die korrespondierende UE.<ot>
Du benutzt den Begriff UE falsch. Eine UE ist nicht mit einer cpp-Datei gleichzusetzen. Vielmehr ist eine UE das Ergebnis des "preprocessings" einer cpp-Datei. Was du am Ende der Headerdatei inkludierst ist also nicht die UE sondern die Implementation des Templates, in diesem Fall die cpp-Datei.
</ot>Nimm es doch nicht so genau und ausserdem, weisst du doch was ich meine :D.
Aber gut, jetzt weiss ich, dass UE != .cpp ist. Ist die Definition von UE
eigentlich im Standard zu finden?mfg
v R
-
Liegt am Compiler, ok. Konnte ich mir nicht denken.
Danke.
-
virtuell Realisticer schrieb:
Nimm es doch nicht so genau und ausserdem, weisst du doch was ich meine :D.
Klar weiß ich was du meinst. Deshalb habe ich meinen pingeligen Kommentar ja auch in <ot>-Klammern geschrieben. So nach dem Motto: kann auch ignoriert werden
Ist die Definition von UE eigentlich im Standard zu finden?
Jup. Der Begriff "translation unit" wird in 2p1 wie folgt definiert:
The text of the program is kept in units called source files in this International Standard. A source file together with all headers (17.4.1.2) and source files included (16.2) via the preprocessing directive #include,
less any source lines skipped by any of the conditional inclusion (16.1) preprocessing directives, is called a translation unit
-
Ah, jetzt hab ich's auch im Draft gefunden. Kann den leider nicht so so schoen
durchsuchen, als wenn man z. B. die pdf-Version des Standards hat ;).Irgendwann werd ich den mir mal zulegen. Aber dafuer brauch man ja leider ne
Kreditkarte.mfg
v R