Wie, um eine überlastung << cout für eine Vorlage-Klasse?
Uns beigebracht, wie man überlastung cout den anderen Tag für unser Programm zu cout, aber ich weiß nicht, wie man es machen Ausgabe alles.
template <NODETYPE>
friend ostream &operator <<(ostream &, List<NODETYPE>& );
template<typename NODETYPE>
ostream &operator <<(ostream& output, List<NODETYPE>& value)
{
output << value;
return output;
}
Allerdings, mein Programm hat mindestens 5 Objekte zur Ausgabe und zwei von Ihnen sind Doppelzimmer. Ich bekomme eine Fehlermeldung, dass der sagt: "Doppel ist kein Gültiger Typ für eine template-Konstante parameter'
Meine zwei Probleme sind: Wie mache ich die Ausgabe alle meine Objekte und nicht nur die ersten Objekts; und wie bekomme ich das doppelte ausgeben. Bitte und danke!
EDIT: RIESIGE EDIT:::
Okay, ich erkannte, dass ich etwas falsch machen, neu arrangiert meine header-und Quelldateien.
Und dann habe ich auch gemerkt, dass fehlt mein Dozent ist Klasse, war einer der größten Fehler die ich je gemacht habe. Mein Nächster Fehler war, denn Sie alle meine Annahmen, und nicht die Informationen, die ich nahm.
In meiner Aufgabe heißt es: • Schreiben Sie eine Zuweisungs-operator und eine friend-Funktion zur Ausgabe der verketteten Liste.
in fast jeder anderen Zeile meiner main-Funktion(eine Funktion, die darf ich nicht verändern), es ist ein cout:
List<int> Li, Li2, Li3;
List<double> Ld, Ld2;
Diese sind meine Objekte. Und alle meine couts in etwa so Aussehen:
cout << "Ld is: " << Ld << endl;
Nach Neuordnung meiner header-und Quelldateien, bekam ich diese Fehlermeldung:
"no match for 'operator<<' in 'std::operator<<[with_Traits = std::char_traits] (((std::basic_ostream>&)(& std::cout)), ((const char*) 'Ld"))<
Ich erhalten, dass für jede einzelne cout-Anweisung, die ich habe. Es ist mehr Informationen, als Ld exit-status 1 oder was auch immer, so werde ich aus diesem.
Ich bin immer noch nicht voll scharf auf mit diesem ostream überladen-Funktion, so dass jede Hilfe sehr geschätzt und ich danke Ihnen so sehr für Ihre Zeit!
EDIT::--
Habe ich fast alle meine code in diesem post: collect2: Ld zurückgegeben, 1 exit status build machen Fehler
Wenn mir jemand helfen könnte mit der überladung, die groß sein würde, weil ich denke, es ist das einzige problem habe ich noch übrig, also habe ich herausfinden können, alles andere.
Dank!!
So schlecht, haha, Sie sind das gleiche..my bad..ich werde es Bearbeiten
Ich verstehe nicht, wie es zu dem Fehler verbunden ist, um die Deklaration/definition oben.
Die Erklärung (D. H. das erste Stück code) sollte geändert werden, um
template <typename NODETYPE>
(d.h. die typename
fehlt). Ist dass das problem?Definition des Betreibers führt zu einer unendlichen Rekursion, nicht?
InformationsquelleAutor Nelliel | 2012-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie durchführen einige Art der iteration über die
List<NODETYPE>
-, Druck-out eines jeden Knotens. Sonst haben Sie eine Endlosschleife, die mit dem operator-Aufruf selbst.Diesem Beispiel druckt die Elemente getrennt durch ein Leerzeichen, in einer einzigen Zeile. Die ich ausgelassen habe, die details der iteration Mechanismus, weil ich nicht weiß Ihrem
List
- Schnittstelle.Dieser davon ausgegangen wird, dass eine
ostream& operator<<
für die node-Typen, wenn nicht musst du das auch. Beachten Sie auch, ich pass die Liste vonconst reference
. Das hat viele Vorteile, einer von Ihnen, die Sie übergeben können temporäre Objekte.Bezüglich der
friend
Erklärung, Sie müssen auchtemplate<typename T>
es, aber es ist nicht klar, Sie müssen der Bedienerfriend
in den ersten Platz. Listen bieten in der Regel Zugriff auf Ihre Elemente in Ihrer öffentlichen Schnittstelle.Abgesehen davon, dass mein header ist ziemlich viel, was es sein sollte. Ich habe einfach immer ein Schatten-Fehler, da von der Vorlage<typename NODETYPE>
Folgen Sie einfach, was ich vorgeschlagen habe in meiner Antwort, und wahrscheinlich fallen die
friend
.wenn der Freund-Erklärung gibt Ihnen shadowing Probleme, ändern
NODETYPE
in der es um etwas anderes.Okay, und wird auch diese Ausgabe der verdoppelt?
InformationsquelleAutor juanchopanza
List<T>
'soperator<<
sollte Durchlaufen und jedes element von TypT
in der Liste und rufenoutput << element;
auf jeden.Dann, stellen Sie sicher, dass jede Art
T
Sie eineList<T>
Objekt mit implementiert auch eineoperator<<
die Ausgänge jeweils die Variablen, die Sie möchten, dass es in dem format, das Sie möchten, dass es, wieoutput << "(" << x << "," << y << ")"
. Built-in-Typen, die dies bereits tun, so zum BeispielList<int>
wird nicht verlangen, diesen Schritt.InformationsquelleAutor Anthony Burleigh
1) Die
friend
Erklärung ist unnötig, es sei denn, dieNODETYPE
Sie als Vorlage verwenden möchten argument ist die Klasse, die Sie selbst definiert, und dieoperator<<
Sie definieren will Zugriff auf private member vonNODETYPE
. Es scheint, dass jetztNODETYPE
istdouble
, so gibt es keine Notwendigkeit für einefriend
Erklärung.Wenn Sie andere Datentypen, die Sie gerne als Vorlage verwenden Argumente, und jene andere Daten-Typen sind eigene Klassen, setzen Sie einen
friend
Erklärung innen dieser Klassen. (Das mag wahr sein, derList
geben Sie, wie unten beschrieben).2) gerade jetzt, Ihre
operator<<
rekursiv ist. Sie müssen (wie dies durch die anderen Antworten) irgendwie eine Iteration durch die Liste derNODETYPE
Objekte bekommen Sie:(Die oben geht davon aus, Ihre
List
Datentyp implementiertbegin()
,end()
und Iteratoren. Sie möchten möglicherweise verwenden Sie eine andere Art der Iteration durch die Elemente derList
. Für, die, können Sie tatsächlich haben, um Zugriff auf private Mitglieder derList
Datentyp, in diesem Fall müssen Sie erklären, dieoperator<<
als ein Freund, der Vorlage (einschließlichtypename
!) innerhalb derList
Klasse definition.)List<NODETYPE>
, nicht zuNODETYPE
selbst.Ja, es scheint, die OP ist mit einfachen (grundlegenden) Datentypen für
NODETYPE
. Ich hoffe, dass der zweite Punkt erklärt, wie es notwendig sein kann, um einefriend
Erklärung in derList
definition.Was ich meine ist, dass die
friend
Erklärung gibt Ihnen Zugang zuList<NODETYPE>
's private member, nichtNODETYPE
's.Nicht, dass das was in der Klammer nach dem ersten, und die Erklärung am Ende den zweiten Punkt sagen? Vielleicht muss ich die Formulierung klarer.
Nach der Lektüre dieses so viele Male, ich verstehe schließlich mehr oder weniger das, was du sagst (bitte um Verzeihung, ich habe nicht geschlafen die ganze Nacht arbeiten, auf dieses Programm) -- Also im Grunde, ich muss eine for-Schleife verwenden, um durch alle gehen, die Objekte, aber dies ist der Teil ich wirklich nicht verstehe... Wie kann ich eine Schleife Durchlaufen, meine Objekte? (Wie kann ich wissen, wie viele Objekte es werden...Es beschränkt sich nicht nur auf diejenigen, die in mein Haupt-fxn in diesem moment...)
InformationsquelleAutor jogojapan