Verstehe den Fehler nicht



  • Also ich habe länger gesucht und bei den Referenzen nichts gefunden, was mir eine
    Dezimalzahl in einen Bruch umwandelt, also wollte ich eine Klasse definieren (Bruch
    halt) wo ich eine Methode habe, die mir Dezimalzahlen in Brüche umwandelt. Habe ich
    dann alles schön gemacht und funktioniert auch, aber der Compiler beschwert sich
    mit folgendem Fehler:

    Warning W8026 test.cpp 25: Functions taking class-by-value argument(s) are not
    expanded inline in function bruch::umwandeln(string,double)

    Hier ist mal mein Quellcode:

    // test.cpp

    #include <iostream>
    using namespace std;

    #include <iostream>
    #include <string>
    #include <cmath>
    using namespace std;

    class bruch
    {
    public:

    int nenner;
    int zaehler;

    bruch()
    {
    nenner = 0;
    zaehler = 0;
    }

    void umwandeln(string s, double d)
    {
    int stelle;
    s.find('.', stelle);

    nenner = pow(10, s.size() - stelle - 1);
    zaehler = nenner * d;
    }
    };

    int main()
    {
    string de;
    double za;
    bruch br;

    cin >> de;
    cin >> za;

    br.umwandeln(de, za);

    cout << "Zaehler: " << br.zaehler << " Nenner: " << br.nenner;

    return 0;
    }

    Nicht wunder, dass gehört eigentlich in ein größeres Programm und das habe ich
    halt nur eben zum testen abgeschrieben :).
    Habe auch schon gegoogelt und bin irgendwie fündig geworden, aber das hat mir
    nicht wirklich weiter geholfen. Anscheinend mag der Compiler es nicht den string
    zu kopieren und deshalb soll er angeblich meckern, aber ob ich das so richtig
    verstanden habe -> keine Ahnung.

    Kann mir das jemand genauer erklären und wie ich das beseitigen kann?

    al3pou



  • Das ist kein Fehler, sondern bloss eine Warnung.

    Da du den string byValue und nicht byReference uebergibst entscheidet sich der Compiler, die Funktion nicht zu inlinen.
    Falls dir passByValue, passByReference und Function Inlining nichts sagt, dann kannst du die Warnung fuer den Moment ignorieren.

    Mit

    void umwandeln(const string& s, double d) 
    {
    //...
    }
    

    sollte die Warnung wahrscheinlich verschwinden.



  • Alle klar. Danke 🙂


Anmelden zum Antworten