Problem mit Argument-Übergabe in Matrix Template Klasse



  • moin moin
    In meiner selbstgeschriebenen Matrix Klasse bekomme ich immer eine Fehlermeldung bei einer Funktion.
    Erstmal die Klasse:

    template <typename T> class Matrix
    {
       private:
        size_t X;
        size_t Y;
        T** pointer; //2D Array bildet die Matrix
    
       public:
        //Konstruktoren, Kopierkonstruktor, Destruktor, Zuweisungsoperator usw
    
        long double winkel(const Matrix& obj); //winkel zwischen 2 vektoren, HIER LIEGT DER FEHLER
        T skalarprodukt(const Matrix& obj);
        long double betrag(); //bzw. länge
    };
    

    Die Funktion zum Berechnen des Betrags:

    template <typename T> long double Matrix<T>::betrag()
    {
        T sum=0;
        for(size_t y=0;y!=Y;++y)
            sum+=(pointer[0][y]*pointer[0][y]);
        long double bet=0;
        bet=std::sqrt(sum);
        return bet;
    }
    

    Die Funktion zum Berechnen des Winkels:

    template <typename T> long double Matrix<T>::winkel(const Matrix& obj)
    {
        const long double pi = 3.14159265;
    
        T skalar = (*this).skalarprodukt(obj); // kein Fehler
        long double betr =(*this).betrag() + obj.betrag(); // HIER DER FEHLER
    
        long double wink=std::acos(skalar/betr);
        return (wink*=(180/pi));
    }
    

    Wenn ich jetzt folgendes Berechnen will

    int main()
    {
        Matrix<int> a(3,1);
        Matrix<int> b(3,1);
        long double c=a.winkel(b);
    }
    

    bekomme ich folgende Fehlermeldung:

    CodeBlocks:

    [b]error: passing `const Matrix<int>' as `this' argument of `long double Matrix<T>::betrag() [with T = int]' discards qualifiers Process [/b]
    

    Visual C++ 2008

    [b]error C2662: 'Matrix<T>::betrag': this-Zeiger kann nicht von 'const Matrix<T>' in 'Matrix<T> &' konvertiert werden
    with [ T=int ]
    Durch die Konvertierung gehen Qualifizierer verloren[/b]
    

    Sieht jemand woran das liegt 😕



  • long double betrag(); //bzw. länge

    muss einfach mal const sein... sonst geht es schlecht, nen konstantes objekt zu übergeben und dann die fkt aufzurufen (wie du es ja versucht hast)...
    außerdem würd ich die funktionen nicht als member-fkt implementieren, sondern eben als freie fkt...

    bb

    PS:

    long double bet=0;
        bet=std::sqrt(sum);
        return bet;
    

    was spricht ggn:

    return std::sqrt(sum);
    

    edit:

    (*this).skalarprodukt(obj);
    
    this->skalarprodukt(obj);
    

    was ist hübscher? ^^


Anmelden zum Antworten