Template-Klasse mit überladenen Operatoren



  • Hallo,

    ich bin gerade an deiner Klasse dran die eine Matrix realisiert.

    Das Problem bezieht sich auf die Operatoren *, nutzt man diese bekommt man eine Fehlermeldung (siehe "Code"), dass die Operatoren mehrdeutig sind.
    Bei den Elementbezogen Operatoren += tritt dieses Problem nicht auf, dort wird zwischen dem Matrix/Matrix und Matrix/Skalar Operator korrekt unterschieden.

    Hat jemand eine Idee?

    Vielen Dank im Voraus... 🙂

    template<typename TemplateType>
    class CMatrix
    {
    public:
    …
    
    // Elementbezogen
    void operator*=(CMatrix const& right_mat);
    
    void operator*=(TemplateType const& skalar);
    
    // Global
    template<typename TemplateType>
    friend CMatrix operator*(CMatrix const& left_mat, CMatrix const& right_mat);
    
    template<typename TemplateType>
    friend CMatrix operator*(CMatrix const& left_mat, TemplateType const& skalar);
    
    protected:
    …
    private:
    …
    };
    
    template<typename TemplateType>
    void CMatrix<TemplateType>::operator*=(CMatrix<TemplateType> const& right_mat)
    {	
    	//...
    }
    template<typename TemplateType>
    void CMatrix<TemplateType>::operator*=(TemplateType const& skalar)
    {	
    	//...
    }
    
    template<typename TemplateType>
    CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, CMatrix<TemplateType> const& right_mat)
    {	
    	//...
    }
    
    template<typename TemplateType>
    CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, TemplateType const& skalar)
    {
    	//...
    }
    
    IntelliSense: Mehr als ein "*"-Operator stimmt mit diesen Operanden überein:
    Funktionsvorlage "CMatrix<double> operator*(const CMatrix<double> &left_mat, const TemplateType &skalar)"
    Funktionsvorlage "CMatrix<TemplateType> operator*(const CMatrix<TemplateType> &left_mat, const CMatrix<TemplateType> &right_mat)"
    Operandentypen sind: CMatrix<double> * CMatrix<double>	d:\Cpp\Projekte\CMatrix\Quelle.cpp	96
    


  • b3n3 schrieb:

    template<typename TemplateType>
    friend CMatrix operator*(CMatrix const& left_mat, CMatrix const& right_mat);
    
    template<typename TemplateType>
    friend CMatrix operator*(CMatrix const& left_mat, TemplateType const& skalar);
    

    ->

    template<typename TemplateType>
    friend CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, CMatrix<TemplateType> const& right_mat);
    
    template<typename TemplateType>
    friend CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, TemplateType const& skalar);
    

    Sonst gibt es nämlich folgende Operatoren:

    template <typename TemplateType>
    CMatrix<double> operator*(CMatrix<double> const&, CMatrix<double> const &); (1)
    template <typename TemplateType>
    CMatrix<double> operator*(CMatrix<double> const&, TemplateType const &); (2)
    template<typename TemplateType>
    CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, CMatrix<TemplateType> const& right_mat); (3)
    template<typename TemplateType>
    CMatrix<TemplateType> operator*(CMatrix<TemplateType> const& left_mat, TemplateType const& skalar); (4)
    

    (1) scheidet direkt aus, weil man dort selber ein Template Argument angeben muss, aber (2) und (3) sind gleichwertig.
    BTW: Prefixe deine Klassen nicht mit C.



  • Alles klar, danke!

    Hatte verdrängt, dass er bei den friend Operatoren seperate Templates erstellt.

    PS: Das C-Präfix ist nicht auf meinem Mist gewachsen, vorgegebene Konvention 😉


Anmelden zum Antworten