Ausgabe Operator bei Templates ? Linker Error .. !
-
Worum genau handelt es sich beim Königs LookUp .. ich kann echt nicht verstehen warum der Code so nicht hinhaut
..
-
Bacid90210 schrieb:
Worum genau handelt es sich beim Königs LookUp
Sogar das deutsche Wiki hat einen Beitrag dazu!
Bacid90210 schrieb:
ich kann echt nicht verstehen warum der Code so nicht hinhaut
..Er haut hin (ich habe ihn sogar getestet!)...
-
Bacid90210 schrieb:
Der Linker sagt mir "operator<<(...const TVector<int>&) referenced from"
Das ist keine vollständige Fehlermeldung.
Templatedefinition und Aufruf in der gleichen ÜE?
-
Undefined symbols for architecture x86_64: "operator<<(std::ostream&, TVector<int> const&)", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)Die Templatedef hab ich in einer header die ich wiederrum in die main einbinde , also nichts besonderes ..
Und die Template-definiton liegt zusammen mit der Implementierung in der .h ..
-
Wozu eigentlich U? Würde Folgendes nicht schon reichen?
template <class T> class TVector { // ...... friend std::ostream& operator<<(std::ostream& out,const TVector& rhs) { out << "BlaBla"; return out; } };
-
In einem anderen projekt hab ich es genauso gemacht .
Und es funktioniert .
Ich verstehe das einfach nicht ..
-
Am gezeigten Code ist nicht auszusetzen. Wenn sich die Definition des Operators tatsächlich in der gleichen ÜE befindet, folgt aus dem Fehler, dass keine Instantiierung vorgenommen wurde. Das kann wiederum nur bedeuten, dass
1. die ausgewählte Funktionsüberladung aus der friend-Deklaration stammt (per ADNL gefunden), und
2. die Definition der Überladung nicht exakt dazu passt, z.B. im falschen Namensraum erfolgt und damit nicht gefunden wird.Mach doch mal ein Copy&Paste der oben gezeigten Code-Zeilen, so wie sie in deinem Projekt tatsächlich vorliegen, und poste sie hier.
-
Jetzt haut es hin .
Ich habe die Operator Definiton einfach in die main gepackt.
-
Bacid90210 schrieb:
Ich habe die Operator Definiton einfach in die main gepackt.
Das ist aber eine ziemlich schlamige Problemlösung. Ist der Operator und die Klasse auch wirklich im selben Namensbereich (das hast du noch nicht bestätigt)(vor dieser Änderung)?
-
Bacid90210 schrieb:
Ich habe die Operator Definiton einfach in die main gepackt.
Du kannst keine Funktionen direkt innerhalb anderer Funktionen definieren. Entweder du hast was anderes gemacht, oder dein Compiler verstösst grob gegen den C++-Standard.
-
Da der operator << selbst ein Template ist (was dir in diesem Fall rein gar nichts bringt) und sich in einer template-Klasse befindet, müsste der Code so aussehen:
template <typename T> template <typename U> std::ostream& TVector<T>::operator << (std::ostream& os, const TVector<U>& v) { return ....; }
-
@314159265358979:
friend<< ist ein binärer Operator, als Klassenmember hat er deshalb stehts nur einen expliziten Parameter.
-
Nexus schrieb:
Du kannst keine Funktionen direkt innerhalb anderer Funktionen definieren. Entweder du hast was anderes gemacht, oder dein Compiler verstösst grob gegen den C++-Standard.
Damit meinte ich natürlich nur in die main.cpp.
Danach hatte ich beim linken keine Probleme mehr.
Der Code sitzt jetzt allerdings wieder in der TTemplate.h und alles funktioniert ohne Probleme.Da der operator << selbst ein Template ist (was dir in diesem Fall rein gar nichts bringt) und sich in einer template-Klasse befindet, müsste der Code so aussehen: .....
Dem stimme ich nicht zu.
Da sich der <<operator auf die ostream Klasse bezieht kann ich ihn nicht explizit überladen , ich habe nämlich keinerlei Zugriff auf die Implementierung der ostream methoden. Deshalb kennzeichne ich ihn ja auch als friend und stelle ihn als globale Funktion bereit.Und damit für jeden Typ ein passender Operator vorhanden ist , handelt es sich selber nochmal um ein Template.
-
Mein Fehler, ich habe an eine template-Memberfunktion gedacht. Der muss natürlich ein Template sein. Da ein Vector aber mindestens Index-Zugriff bietet (Iteratoren solltest du auch einbauen), brauchst du ihn ja nicht als friend deklarieren.