@KingTrainJumpa
Wenn man die Fehlermeldung etwas einrückt wird sie viel übersichtlicher
no match for 'operator>>' in '
(
(std::basic_ostream<char, std::char_traits<char> >*)std::operator<<
[with _Traits = std::char_traits<char>]
(
((std::basic_ostream<char, std::char_traits<char> >&)(& std::cout)),
((const char*)"Zahl ist:")
)
)->std::basic_ostream<_CharT, _Traits>::operator<<
[with _CharT = char, _Traits = std::char_traits<char>]
(
zahl
)
>> std::endl
'
Hier sieht man schön dass erstmal operator << mit (std::cout, "Zahl ist:") als Parameter aufgerufen wird, also std::cout << "Zahl ist:" .
Der (std::basic_ostream<char, std::char_traits<char> >*) Teil scheint eine komische Eigenart von GCC zu sein, da hier vermutlich gar keine Typkonvertierung stattfindet (nichtmal ein impliziter Upcast). Auch schreibt hier GCC nen Zeigertyp an, der eigentlich nirgends im originalen Code vorkommt - vermutlich damit er dann weiter unten "->" statt "." schreiben kann -- warum auch immer. Vermutlich ist aber genau das der Grund -- irgendwo in den GCC Eingeweiden wird es eine Node "mach nen this-Zeiger aus ner Referenz" geben, und daher wird hier eine Konvertierung angeschrieben die es eigentlich gar nicht gibt. Ist jetzt geraten, erschiene mir aber schlüssig.
Der [with _Traits = std::char_traits<char>] Teil besagt dass es sich um ein Funktionstemplate handelt, und das _Traits Template-Argument eben std::char_traits<char> war.
Die darauf folgende Klammer enthält die Parameterliste. Hier sind wieder implizite Konvertierungen in C-Style-Cast Syntax zu sehen (die Typen der Ausdrücke entsprechen nicht exakt den Parameter-Typen, also muss konvertiert werden, und daher schreibt der Compiler den Cast hin).
Auf das Ergebnis davon wird dann ->operator << aufgerufen, mit zahl als Parameter, also std::cout << "Zahl ist:" << zahl .
Das "->" kennzeichnet dass hier auf das was vorher Stand eine Memberfunktion aufgerufen wird.
Hier wieder schön die Template-Argumente. Und diesmal kein Cast beim Parameter, vermutlich weil "zahl" bereits exakt dem erwarteten Typ entspricht und daher keine Konvertierung durchgeführt wird.
Danach kommt dann der Operator den er nicht zuordnen konnte gefolgt von std::endl . Dass das der Operator ist den er nicht finden konnte sieht man einerseits daran dass es der einzige >> Operator in der Meldung ist, und andrerseits daran dass er nicht qualifiziert ist (kein irgendwas::operator >> sondern einfach nur >> ).
D.h. im Programm steht irgendwo std::cout << "Zahl ist:" << zahl >> std::endl , und der Compiler beschwert sich dass er keinen passenden operator >> für >> std::endl finden kann.
Die einfachere Variante diese Fehlermeldung zu lesen wäre gewesen:
"no match for 'operator>>'" lesen.
Doppelklicken und gucken.
"Aha, nur ein >> in der Zeile" -> der muss gemeint sein.
Nachdenken.
"Ach, guck, >> ist ja die falsche Richtung" -> Fehler gefunden.