CodeBlocks-Fehlermeldung ist unklar



  • moin leute!
    ich bin auf dem gebiet der c++-programmierung so neu, wie man es nur sein kann...
    habe eine fehlermeldung bekommen und weiß nicht, was diese aussagt.
    es ist die folgende:
    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'|
    ||=== Build finished: 1 errors, 0 warnings ===|

    kann mir bitte jhemand einen hinweis geben, was es sein kann?!

    danke!



  • cin funktioniert zb. so

    int variable; cin >> variable;
    

    wobei Variable halt ein Typ sein muss, den cin halt aktzeptiert (also für dich erstmal Standarddatentypen wie int, float, char und sowas).

    cout funktioniert zb. so:

    cout << "Geb was ein: ";
    

    Das musst du sauber trennen. Wenn du eine Variable von Typ int eingeben lassen willst, musst du das so machen:

    cout << "Gebe eine Zahl ein: ";
    int zahl;
    cin >> zahl; 
    //...
    

    DU hast cout irgendwie falsch benutzt, aber ohne deinen Code kann ich dir nicht viel weiterhelfen.



  • Ja, die Template Fehlermeldungen von den meisten C++ Compilern sind schon was feines 😃

    Genau kann ich es dir ohne Code auch nicht sagen, aber fuer mich sieht das so aus, als haettest du bei einer std::cout Anweisung versehentlich ">>" anstelle von "<<" benutzt (kurz bevor "endl")



  • Zeig mal Code. Das sieht nach totalem Syntaxmüll aus...



  • Eric Cartman schrieb:

    Ja, die Template Fehlermeldungen von den meisten C++ Compilern sind schon was feines 😃

    Hoffentlich kommen endlich die Concepts in C++17...



  • Dir fehlt

    #include <string>
    

    Edit: Doch nicht. Ist nur so ein beliebter Fehler, dass ich die genaue Meldung gar nicht gelesen habe.



  • Eric Cartman schrieb:

    Ja, die Template Fehlermeldungen von den meisten C++ Compilern sind schon was feines 😃

    Genau kann ich es dir ohne Code auch nicht sagen, aber fuer mich sieht das so aus, als haettest du bei einer std::cout Anweisung versehentlich ">>" anstelle von "<<" benutzt (kurz bevor "endl")

    👍 👍 das war es! danke!



  • Eric Cartman schrieb:

    Ja, die Template Fehlermeldungen von den meisten C++ Compilern sind schon was feines 😃

    Genau kann ich es dir ohne Code auch nicht sagen, aber fuer mich sieht das so aus, als haettest du bei einer std::cout Anweisung versehentlich ">>" anstelle von "<<" benutzt (kurz bevor "endl")

    wo ran hast du es erkannt?
    gibt es allgemein irgendwelche zeichen in diesen fehlermeldungen, die "konkret" aussagen, was der fehler ist?



  • KingTrainJumpa schrieb:

    Eric Cartman schrieb:

    Ja, die Template Fehlermeldungen von den meisten C++ Compilern sind schon was feines 😃

    Genau kann ich es dir ohne Code auch nicht sagen, aber fuer mich sieht das so aus, als haettest du bei einer std::cout Anweisung versehentlich ">>" anstelle von "<<" benutzt (kurz bevor "endl")

    wo ran hast du es erkannt?
    gibt es allgemein irgendwelche zeichen in diesen fehlermeldungen, die "konkret" aussagen, was der fehler ist?

    no match for 'operator>>' in '((std::basic_ostream<char, std::char_traits<char> >



  • KingTrainJumpa schrieb:

    gibt es allgemein irgendwelche zeichen in diesen fehlermeldungen, die "konkret" aussagen, was der fehler ist?

    ROFL ROFL ROFL
    Neh, Fehlermeldungen sind nur dazu da um einfach zu sagen dass was nicht stimmt.



  • KingTrainJumpa schrieb:

    wo ran hast du es erkannt?
    gibt es allgemein irgendwelche zeichen in diesen fehlermeldungen, die "konkret" aussagen, was der fehler ist?

    KingTrainJumpa schrieb:

    [ ... ](zahl) >> std::endl'|
    


  • KingTrainJumpa schrieb:

    Eric Cartman schrieb:

    Ja, die Template Fehlermeldungen von den meisten C++ Compilern sind schon was feines 😃

    Genau kann ich es dir ohne Code auch nicht sagen, aber fuer mich sieht das so aus, als haettest du bei einer std::cout Anweisung versehentlich ">>" anstelle von "<<" benutzt (kurz bevor "endl")

    wo ran hast du es erkannt?
    gibt es allgemein irgendwelche zeichen in diesen fehlermeldungen, die "konkret" aussagen, was der fehler ist?

    C++ Fehlermeldungen betreffend der STL sind halt so eine Sache ... 😃
    Wie Sone und Swordfish bereits gezeigt haben, muss man die Fehlermeldung etwas auseinandernehmen, aber als Anfaenger kannste das erstmal vergessen bis du nicht naeher mit der STL vertraut bist.
    Hier ein Tipp zur Fehlererkennung: Teile die fehlerhafte Zeile in mehrere Zeilen soweit moeglich und kompiliere erneut. Dann bekommts du einen besseren Ueberblick, was genau falsch sein kann.



  • Sone schrieb:

    KingTrainJumpa schrieb:

    gibt es allgemein irgendwelche zeichen in diesen fehlermeldungen, die "konkret" aussagen, was der fehler ist?

    ROFL ROFL ROFL
    Neh, Fehlermeldungen sind nur dazu da um einfach zu sagen dass was nicht stimmt.

    Mit solchen Fehlermeldungen kann man aber wirklich wenig anfangen, wenn man nicht sonderlich viel Erfahrung hat. Wenn man mti Templates arbeitet, kann das ganze noch viel lustiger werden.



  • @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.


Log in to reply